Bash Scripting - перенаправление вывода команды оболочки - PullRequest
6 голосов
/ 06 февраля 2009

Может ли кто-нибудь помочь объяснить следующее:

Если я наберу:

a=`ls -l`

Затем вывод команды ls сохраняется в переменной a

но если я попытаюсь:

a=`sh ./somefile`

Результат выводится в оболочку (stdout), а не в переменную a

То, что я ожидал, было результатом операции оболочки, пытающейся выполнить скрипт 'somefile' для сохранения в переменной.

Пожалуйста, укажите, что не так с моим пониманием и возможный способ сделать это.

Спасибо.

EDIT:

Просто чтобы уточнить, сценарий 'somefile' может существовать или не существовать. Если он существует, то я хочу, чтобы выходные данные скрипта были сохранены в 'a'. Если нет, я хочу, чтобы сообщение об ошибке «нет такого файла или каталога» сохранялось в «a»

Ответы [ 3 ]

15 голосов
/ 06 февраля 2009

Я думаю, потому что оболочка, вероятно, присоединяется к / dev / tty, но я могу ошибаться. Почему бы вам не установить права на выполнение скрипта и использовать:

a=`./somefile`

Если вы хотите захватить stderr и stdout в a, просто используйте:

a=`./somefile 2>&1`

Чтобы проверить, исполняется ли файл первым:

if [[ -x ./somefile ]] ; then
    a=$(./somefile 2>&1)
else
    a="Couldn't find the darned thing."
fi

и вы заметите, что я переключаюсь на метод $ () вместо обратных галочек. Я предпочитаю $ (), так как вы можете их вкладывать (например, "a=$(expr 1 + $(expr 2 + 3))").

5 голосов
/ 06 февраля 2009

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

a=$(sh ./somefile)

Если это все еще не работает, проверьте, действительно ли somefile stderr 'ing.

2 голосов
/ 06 февраля 2009

Вы правы, стандартный вывод ./somefile хранится в переменной a. Однако я предполагаю вывод некоторых файлов в stderr. Вы можете перенаправить его с помощью 2>&1 сразу после ./somefile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...