Запуск bash-скрипта из оболочки zsh

11

У меня проблемы с запуском скрипта bash zsh. Сценарий похож на приведенный ниже и должен работать под Bash:

#!/bin/bash
echo "<235234>"  | egrep -oe [0-9]+

Тем не менее, моя оболочка по умолчанию включена zsh, поэтому для запуска приведенного выше сценария введите /bin/bashв командной zshстроке, а затем я запускаю . script.sh.

Тем не менее, это приводит к ошибке, и я получаю:

zsh: no matches found: [0-9]+

(Я должен получить 235234вместо).

На данный момент я запутался и у меня есть следующие вопросы:

  1. Если я нахожусь в bash, почему я получаю сообщение об ошибке zsh?
  2. Почему egrepрегулярное выражение терпит неудачу? Регулярное выражение выглядит правильно для меня.

Примечание: в случае, если это имеет значение, я не должен изменять сценарий (сценарий является общим для нескольких пользователей, и мы не должны вносить в него изменения).

Спасибо

Амелио Васкес-Рейна
источник

Ответы:

19

Если скрипт правильно начинается с #!/bin/bash(у вас не может быть другого комментария до этого), вы должны просто выполнить его, набрав /path/to/script.sh, без этого .в начале. Это .оператор включения, он означает «выполнить содержимое этого файла, как если бы он был напечатан здесь в командной строке» (это называется «sourcing» в жаргоне оболочки Unix).

Запуск bash и поиск сценария должны работать. Я предполагаю, что поскольку у вас bash автоматически запускался при некоторых обстоятельствах, но вы предпочитаете zsh, вы настроили bash для автоматического переключения на zsh - возможно, с помощью exec zshвашего ~/.bashrc. Не делайте этого: вместо этого вам следует переключиться на zsh в файле, который выполняется при входе в систему, т. Е. ~/.profileИ оставить в .bashrcпокое. Для zshвыполнения в терминалах установите SHELLпеременную окружения:

# in ~/.profile
export SHELL=/bin/zsh
if [ -t 1 ]; then exec $SHELL; fi

К сожалению, вы не можете изменить скрипт, потому что он глючит. Скобки должны быть в кавычках, даже в bash. Если 3+в текущем каталоге вызывается файл , вызов egrepбудет искать одно или несколько вхождений цифры 3вместо последовательности произвольных цифр. Если есть файл с именем 3+и файл 4+, который вызывается, вызов egrepбудет искать 3s в файле 4+. Здесь различие между bash и zsh вступает в силу только тогда, когда ни один файл не соответствует предоставленному шаблону: bash молча запускает команду с незамещенным шаблоном, тогда как zsh сообщает об ошибке (по умолчанию).

Жиль "ТАК - перестань быть злым"
источник
Спасибо @Guilles. Это было очень полезно. Странно то, что у меня нет ни exec zshмоего ~/.bashrc, ни моего ~/.profile(у меня даже нет .profileсвоего домашнего каталога). Я не помню, как мне удалось сделать zshмою оболочку по умолчанию. Кроме того, извините за путаницу, но первая строка в моем сценарии - шебанг #!/bin/bash. При этом я до сих пор не знаю, почему поиск файла zshне работает (если у вас есть какие-либо мысли по этому поводу, дайте мне знать). В любом случае, я свяжусь с администратором, чтобы обновить скрипт, но добавить кавычки в регулярное выражение.
Амелио Васкес-Рейна
Проблема с поиском в zsh - второй аргумент egrep.
Игнасио Васкес-Абрамс