2013-06-06 4 views
1

Я работаю на Mac с помощью OSX, и я использую bash как свою оболочку. У меня есть сценарий, который идет что-то эффект:Вход xargs с пробелами

VAR1="pass me into parallel please!" 
VAR2="oh me too, and there's actually a lot of us, but its best we stay here too" 
printf "%s\n" {0..249} | xargs -0 -P 8 -n 1 . ./parallel.sh 

я получаю ошибку: xargs: .: Permission denied. Цель состоит в том, чтобы параллельно запускать другой скрипт (называемый parallel.sh), который получает данные с номерами 0-249. Кроме того, я хочу убедиться, что параллель может видеть и нас VAR1 и VAR2. Но когда я пытаюсь запустить скрипт параллельно с . ./parallel, xargs это не нравится. Суть поиска заключается в том, что сценарий имеет другие переменные, к которым я хочу иметь параллельный доступ.

Я прочитал что-то об использовании print0, поскольку xargs разделяет его входы по пробелам, но я действительно не понимал, что делает -print0 и как его использовать. Спасибо за любую помощь, которую вы, ребята, можете предложить.

+0

Что дополнительный '.' для? – mgamba

+0

Что вы подразумеваете под «параллельным доступом» и «параллельным доступом»? Вы хотите, чтобы несколько процессов выполняли скрипт parallel.sh и связывались через общие переменные? –

+0

Разве это не то, как вы делаете переменные, объявленные в скрипте доступными для параллельного скрипта? Я думал, что именно так вы «получили». Имейте в виду, что я новичок - лучше. –

ответ

2

Если вы хотите несколько процессов, выполняющихся сценарий, то они не могут быть частью и поэтому они не могут получить доступ к тем же самым переменным. Тем не менее, если вы экспортируете переменные, то каждый процесс может получить копию из них:

export VAR1="pass me into parallel please!" 
export VAR2="oh me too, and there's actually a lot of us, but its best we stay here too" 
printf "%s\n" {0..249} | xargs -P 8 -n 1 ./parallel.sh 

Теперь вы можете просто упасть дополнительные точки, так как вы не Sourcing сценарий parallel.sh, вы просто запустить его ,

Также нет необходимости использовать -0, так как ваш ввод представляет собой всего лишь ряд цифр, по одному на каждую строку.

+1

'bash' не имеет ключевого слова' extern'; Я думаю, вы имеете в виду «экспорт». – chepner

+0

@chepner: geez. благодаря! написав слишком много C-кода сегодня ... :) –

+0

Не использует 'xargs' для запуска' parallel', а ... overkill? На странице 'parallel' man: _ Если вы используете' xargs' сегодня, вы обнаружите, что GNU 'parallel' очень прост в использовании, поскольку GNU' parallel' записывается так же, как и 'xargs'_ –

1

Вопрос о передаче аргументов связан с интерпретацией пробела xarg. На странице xargs человек:

-0  Change xargs to expect NUL (``\0'') characters as separators, instead of spaces and newlines. 

Вопрос о переменных окружения может быть решена с помощью export, чтобы сделать переменные доступными для подпроцессов:

say.sh

echo "$1 $V" 

результат

bash$ export V=whatevs 
bash$ printf "%s\n" {0..3} | xargs -P 8 -n 1 ./say.sh 
1 whatevs 
2 whatevs 
0 whatevs 
3 whatevs 
+0

Это не позволяет мне использовать переменные, которые я создал в этом скрипте. –

+0

Удаление аргумента '-0' позволяет xargs использовать' \ n' в качестве разделителя. – mgamba

+0

@NoviceC Вам нужно экспортировать переменные, поскольку запуск 'parallel.sh' через' xargs' исключает запуск его в той же оболочке, где определены переменные. – chepner

1

Я думаю, что у вас есть проблемы с разрешением, попробуйте получить выполнение pe rmission для этого файла "parallel.sh"

команды отлично работает для меня:

Kaizen ~/so_test $ printf "%s\n" {0..4} | xargs -0 -P 8 -n 1 echo 
0 
1 
2 
3 
4 

людей найти:

-print0

True; напечатайте полное имя файла на стандартном выходе, за которым следует нулевой символ (вместо символа новой строки, который использует -print). Это позволяет именам файлов, которые содержат символы новой строки или другие типы пробелов, правильно интерпретироваться программами, обрабатывающими вывод . Эта опция соответствует опции -0 для xargs.

для print0 использования: проверить соединение вне: есть вопрос для него в переполнение стека

Capturing output of find . -print0 into a bash array

0

Чтобы избежать проблемы пространства я бы использовать символ новой строки в качестве разделителя для xargs с опцией -d:

xargs -d '\n' ... 
Смежные вопросы