Вызов вложенной функции в xargs (на MacOS) [дубликат]

Оператор == всегда предназначен для сравнения ссылок на объекты, тогда как метод сравнения строк .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)
107
задан codeforester 14 December 2017 в 23:11
поделиться

4 ответа

Экспорт функции должен выполняться (непроверенный):

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, подобные этому, маскирует любое значение ошибки, которое может быть получено командой, предшествующей ему. Кроме того, если нет ошибки, это значение по умолчанию и, следовательно, несколько избыточно.

106
ответ дан Dennis Williamson 16 August 2018 в 01:45
поделиться
  • 1
    Еще немного обсуждений: xargs выполняет совершенно новый экземпляр названного процесса. В этом случае вы указываете имя echo_var, которое является функцией в этом скрипте, а не процессом (программой) в вашем PATH. Решением Dennis является экспорт функции для дочерних процессов bash для использования, затем вилки для подпроцесса и выполняется там. – David Souther 12 June 2012 в 20:39
  • 2
    каково значение _ и \, без них он не работал для меня – Hashbrown 19 October 2013 в 09:16
  • 3
    @Hashbrown: подчеркивание (_) предоставляет место для argv[0] ($0) и почти все может быть там использовано. Я думаю, что я добавил символ с обратной косой чертой (\;) из-за его использования в завершении предложения -exec в find, но он работает для меня без него. Фактически, если бы функция использовала $@ вместо $1, тогда она увидела точку с запятой в качестве параметра, поэтому ее следует опустить. – Dennis Williamson 19 October 2013 в 12:35
  • 4
    -i аргумент для xargs с тех пор устарел. Вместо этого используйте -I (капитал i). – Nicolai S 7 July 2015 в 20:44
  • 5
    Вы можете упростить это, включив аргумент из xargs в командной строке для bash с помощью bash -c 'echo_var "{}"'. Поэтому вам не нужно _ {} в конце. – phobic 2 June 2016 в 08:57

Что-то вроде этого должно работать также:

function testing() { sleep $1 ; }
echo {1..10} | xargs -n 1 | xargs -I@ -P4 bash -c "$(declare -f testing) ; testing @ ; echo @ "
6
ответ дан Ciro Santilli 新疆改造中心 六四事件 法轮功 16 August 2018 в 01:45
поделиться

Использование 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 {} 
14
ответ дан Ole Tange 16 August 2018 в 01:45
поделиться
  • 1
    где я могу получить shopt для osx? – Nick 11 October 2014 в 16:01
  • 2
    nvm это setopt в zsh – Nick 11 October 2014 в 16:08
  • 3
    Получение этого ниже eerror Ole 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
  • 4
    Вы были скопированы: Shellshock не повлиял на GNU Parallel напрямую. Однако решение shellshock: Это полностью нарушило --env и трюк env_parallel. Считается, что он исправлен в версии git: git.savannah.gnu.org/cgit/parallel.git/snapshot/… – Ole Tange 11 October 2014 в 19:19
  • 5
    Мне нравится этот ответ, потому что он заставил меня открыть параллельный инструмент – JR Utily 9 February 2015 в 15:03

Возможно, это плохая практика, но если вы определяете функции в .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
0
ответ дан xdhmoore 16 August 2018 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: