Как передать несколько аргументов скрипту, вызываемому в экранной команде? - PullRequest
0 голосов
/ 04 декабря 2018

Я создаю отдельный экран player, который запускает скрипт player.sh, который имеет несколько аргументов из массива AR.

AR=('foo' 'bar' 'space' 'bat')
screen -S player -dm bash -c "/home/deanresin/scripts/player.sh ${AR[@]}"

, но он анализируется как ...

+ screen -S player -dm bash -c '/home/deanresin/scripts/player.sh foo' bar space bat

и только первый аргумент, foo, передается в player.sh.

Если я вручную введу массив, он будет работать ..

screen -S player -dm bash -c "/home/deanresin/scripts/player.sh foo bar space bat"

+ screen -S player -dm bash -c '/home/deanresin/scripts/player.sh foo bar space bat'

и все они получатпередан player.sh.

Пожалуйста, помогите, я выдернул свои волосы.

edit:

Я тоже пытался ..

screen -S player -dm bash -c "/home/deanresin/scripts/player.sh "`echo "${AR[@]}"`

с таким же нежелательным результатом.

1 Ответ

0 голосов
/ 04 декабря 2018

Проще, если вы не попытаетесь добавить косвенное указание через bash -c:

screen -S player -dm /home/deanresin/scripts/player.sh "${AR[@]}"

Если вам когда-либо понадобится вставить его в bash -c, вы должны выйти изправильно аргументируйте и объедините их в этот единственный аргумент:

screen -S player -dm bash -c "/home/deanresin/scripts/player.sh $(printf "%q " "${AR[@]}")"

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

screen -S player -dm bash -c '/home/deanresin/scripts/player.sh "$@"' _ "${AR[@]}"

Неправильное решение использует вместо этого bash -c "/home/deanresin/scripts/player.sh ${AR[*]}" для объединения всех элементов без экранирования, но это не учитывает метасимволы оболочки и поэтому лучше избегать.

...