Почему я не могу сопоставить строку?

#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», это означает, что содержит