Почему в моем сценарии оболочки отображается отдельный вывод, если каждая команда запускается индивидуально?

Вопрос:

У меня есть следующий сценарий оболочки

#!/bin/sh
keyExists='stat ~/.ssh/id_rsa &> /dev/null; echo $?'
echo $keyExists

Когда я запускаю его как ./test.sh или sh test.sh он выводит

0 File: '/home/vagrant/.ssh/id_rsa' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fc00h/64512d Inode: 2888560 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1000/ vagrant) Gid: ( 1000/ vagrant) Access: 2014-07-23 11:40:33.355848310 -0400 Modify: 2014-07-23 11:40:33.355848310 -0400 Change: 2014-07-23 11:40:33.355848310 -0400 Birth: -

Однако, когда я запускаю каждую команду отдельно в командной строке

keyExists='stat ~/.ssh/id_rsa &> /dev/null; echo $?'
echo $keyExists

Я получаю вывод

0

Почему я вижу этот дополнительный вывод и как я могу подавить этот дополнительный вывод при запуске сценария оболочки?

Лучший ответ:

Перед тестированием убедитесь, что ваша текущая оболочка /bin/sh, not /bin/bash.

Насколько я знаю: &> – новая функция в bash, а не в старой sh.

Ответ №1

Вместо использования &>/dev/null сделайте это как >/dev/null 2>&1. Это заставит ваш скрипт работать даже с древними sh shells. Вы также можете изменить заголовок на #!/bin/bash если у вас действительно есть bash. Или посмотрите вывод, о which bash знать which bash.

Оцените статью
TechArks.Ru
Добавить комментарий