5

Когда я бегу

curl | tee test.txt; echo ${PIPESTATUS[0]}

Я правильно вижу

curl: попробуйте 'curl --help' или 'curl --manual' для получения дополнительной информации

2

Но когда я пытаюсь запустить точно такую же команду, используя '/bin/sh':

sh -c "curl | tee test.txt; echo \${PIPESTATUS[0]}"

я получил

curl: попробуйте 'curl --help' или 'curl --manual' для получения дополнительной информации

sh: 1: плохая замена

Как мы можем решить проблему Bad substitution , пожалуйста?

3 ответа3

5

Вы решаете это, не используя sh .

В частности, переменная PIPESTATUS и синтаксис массива ${var[idx]} в целом являются особенностями оболочки Bash. Они не существуют в POSIX sh, и даже оболочки, у которых есть массивы, могут использовать другой синтаксис.

Случается, что некоторые дистрибутивы Linux ссылаются на свои /bin/sh на Bash. Другие дистрибутивы, однако, симлинки это тир, Debian Альмквист Shell. Оба совместимы со сценариями POSIX sh, но только Bash принимает синтаксис ${PIPESTATUS[…]} .

Поэтому, если вы хотите использовать его, вместо этого запустите bash -c "…" .

4

Обходной путь для '/bin/sh' или busybox

status=0
eval ` { ls /dontexists || echo status="$?"; } | tee /dev/null`
echo "# status=${status}"

Трассировка:

busybox sh ~/bin/test.sh 
+ status=0
+ ls /dontexists
+ tee /dev/null
ls: /dontexists: No such file or directory
+ echo status=1
+ eval status=1
+ status=1
+ echo # status=1
# status=1
1

Также 'bash -c', похоже, имеет проблему с ним при вызове из tcsh:

bash -c "curl | tee test.txt; echo \${PIPESTATUS[0]}"

PIPESTATUS: неопределенная переменная.

Это работает для меня из tcsh:

bash -c 'curl | tee test.txt; echo ${PIPESTATUS[0]}'

curl: попробуйте 'curl --help' или 'curl --manual' для получения дополнительной информации
2

GNU bash, версия 4.2.25(1)-релиз (x86_64-pc-linux-gnu)
вызывается из tcsh 6.17.06

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .