#bash #shell
#bash #оболочка
Вопрос:
мой код:
# (1)
#result='/usr/bin/which: no commandName in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/wks/.local/bin:/home/wks/bin)'
# (2)
result=`which commandName`
echo $result
reg='commandName'
if [[ $result =~ $reg ]]
then echo "exit"
else echo "not exit"
fi
Если я использую код (2), он будет напечатан not exit
, но если я использую код (1), он будет напечатан exit
.
Но which commandName
получит тот же контент на моем компьютере, это
/usr/bin/which: no commandName in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/wks/.local/bin:/home/wks/bin)
итак, в чем причина другого поведения?
Комментарии:
1. `используются для выполнения другой команды, например:
var=`ls /home/`
. Что->(2):
предполагаю сделать, я получаю команду, которая не найдена.
Ответ №1:
Проблема в том, что в вашем коде (2) result
заканчивается пустым.
/usr/bin/which: no commandName ...
является сообщением об ошибке и, следовательно, записывается в stderr. Обратные подсказки (как в `which ...`
) фиксируют только стандартный вывод, а не ошибки.
Если вы хотите записать как stdout, так и stderr, сделайте что-то вроде
result=$(which commandName 2>amp;1)
Комментарии:
1. правильно, с echo $ result , я действительно видел строку с пробелом
Ответ №2:
в bash используйте в строке, следующей за какой переменной $? чтобы проверить, как завершилась последняя команда, которая называется «which», и второй тест выполнять, только если код возврата равен 0, код 1 означает, что команда выполнена с ошибкой.
res=`which asasa`
if [[ $? -eq 0 ]]
then
#etc.
Комментарии:
1. Я знаю, что это работает, но мне интересно, почему упомянутый мной код не работает
2. потому что результат содержит строку «/ usr / bin / which: нет имени команды в (/ usr / local / bin: / usr / bin: / usr / local / sbin: / usr / sbin: / home / wks /. local / bin: / home / wks / bin)», а не строку «CommandName», как вы ожидаете.
3. но я использую = ~ . это означает, содержит ли строка правильную строку
4. w bash = ~ означает, что stringA не соответствует stringB
5. но если я использую код (1), присвою значение «/ usr / bin / which: no CommandName in ….» значению $result , оно выведет «exit», это означает, что содержит