Невозможно записать код выхода `/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: $?