Невозможно записать код выхода `/bin/sh`

Я использую /bin/bash в качестве внешней оболочки, и я использую по умолчанию /bin/sh от busybox,

Ниже я могу получить код выхода, как и ожидалось:

$ docker run -it --rm busybox /bin/sh -c "bin/sh -c \"cat /foo/bar\" && echo Shell Result: $?" || echo Docker Result: $?
cat: can't open '/foo/bar': No such file or directory
Docker Result: 1

очевидно cat /foo/bar потерпел неудачу, и именно так мы вводим утверждение с другой стороны ||, Однако, когда я попытался повторить результат, значение $? является 0 (показано ниже):

$ docker run -it --rm busybox /bin/sh -c "bin/sh -c \"cat /foo/bar\" || echo Shell Result: $?" || echo Docker Result: $?
cat: can't open '/foo/bar': No such file or directory
Shell Result: 0

Где хранится результат или как его получить?

2 ответа

Решение

Переменные раскрываются в двойных кавычках. Это относится к $? также.

$ true; /bin/sh -c "cat /foo/bar || echo Result: $?"
cat: /foo/bar: No such file or directory
Result: 0
$ false; /bin/sh -c "cat /foo/bar || echo Result: $?"
cat: /foo/bar: No such file or directory
Result: 1

Решение: используйте одинарные кавычки или избегайте $:

$ true; /bin/sh -c 'cat /foo/bar || echo Result: $?'
cat: /foo/bar: No such file or directory
Result: 1
$ true; /bin/sh -c "cat /foo/bar || echo Result: \$?"
cat: /foo/bar: No such file or directory
Result: 1

Вы видите это, потому что расширение переменной выполняется в команде до ее выполнения. Попробуйте убежать от $?

docker run -it --rm busybox /bin/sh -c "bin/sh -c \"cat /foo/bar\" || echo Shell Result: \$?" || echo Docker Result: $?

В качестве альтернативы, если вам не нужны никакие другие расширения переменных в вашей команде, просто используйте одинарные кавычки (тогда вам также не нужно экранировать внутренние кавычки):

docker run -it --rm busybox /bin/sh -c 'bin/sh -c "cat /foo/bar" || echo Shell Result: $?' || echo Docker Result: $?
Другие вопросы по тегам