Оператор == всегда предназначен для сравнения ссылок на объекты, тогда как метод сравнения строк .equals () переопределяется для сравнения содержимого:
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); // It prints false (reference comparison)
System.out.println(s1.equals(s2)); // It prints true (content comparison)
Экспорт функции должен выполняться (непроверенный):
export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
Вместо внешнего seq
:
printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
можно использовать встроенный printf
. Кроме того, , используя return 0
и exit 0
, подобные этому, маскирует любое значение ошибки, которое может быть получено командой, предшествующей ему. Кроме того, если нет ошибки, это значение по умолчанию и, следовательно, несколько избыточно.
Что-то вроде этого должно работать также:
function testing() { sleep $1 ; }
echo {1..10} | xargs -n 1 | xargs -I@ -P4 bash -c "$(declare -f testing) ; testing @ ; echo @ "
Использование GNU Parallel выглядит так:
#!/bin/bash
echo_var(){
echo $1
return 0
}
export -f echo_var
seq -f "n%04g" 1 100 | parallel -P 10 echo_var {}
exit 0
Если вы используете версию 20170822, вам даже не нужно export -f
, пока вы это запустили:
. `which env_parallel.bash`
seq -f "n%04g" 1 100 | env_parallel -P 10 echo_var {}
sh: parallel_bash_environment: line 67: unexpected EOF while looking for matching
'' sh: parallel_bash_environment: строка 79: синтаксическая ошибка: неожиданный конец файла sh: определение функции импорта ошибок для parallel_bash_environment' /usr/local/bin/bash: parallel_bash_environment: line 67: unexpected EOF while looking for matching
'' / usr / local / bin / bash: parallel_bash_environment: строка 79: синтаксическая ошибка: неожиданный конец файла / usr / local / bin / bash: определение функции импорта ошибок для `...
– Nick
11 October 2014 в 16:16
Возможно, это плохая практика, но если вы определяете функции в .bashrc
или другом скрипте, вы можете обернуть файл или, по крайней мере, определения функций с помощью параметра allexport
:
set -o allexport
function funcy_town {
echo 'this is a function'
}
function func_rock {
echo 'this is a function, but different'
}
function cyber_func {
echo 'this function does important things'
}
function the_man_from_funcle {
echo 'not gonna lie'
}
function funcle_wiggly {
echo 'at this point I\'m doing it for the funny names'
}
function extreme_function {
echo 'goodbye'
}
set +o allexport
echo_var
, которое является функцией в этом скрипте, а не процессом (программой) в вашем PATH. Решением Dennis является экспорт функции для дочерних процессов bash для использования, затем вилки для подпроцесса и выполняется там. – David Souther 12 June 2012 в 20:39_
и\
, без них он не работал для меня – Hashbrown 19 October 2013 в 09:16_
) предоставляет место дляargv[0]
($0
) и почти все может быть там использовано. Я думаю, что я добавил символ с обратной косой чертой (\;
) из-за его использования в завершении предложения-exec
вfind
, но он работает для меня без него. Фактически, если бы функция использовала$@
вместо$1
, тогда она увидела точку с запятой в качестве параметра, поэтому ее следует опустить. – Dennis Williamson 19 October 2013 в 12:35bash -c 'echo_var "{}"'
. Поэтому вам не нужно _ {} в конце. – phobic 2 June 2016 в 08:57