Я пишу скрипт для копирования некоторых файлов и пытаюсь использовать его, shopt -s dotglob
чтобы позволить cp копировать точечные файлы, как .jshint
и еще много чего.
Я могу запустить shopt -s dotglob
напрямую в командной строке без ошибок. Однако при запуске сценария выдается ошибка:
script.sh: 81: script.sh: shopt: not found
Я запускаю этот скрипт в оболочке bash с заголовком shebang #!/usr/bin/env bash
. Строка ошибки:
shopt -s dotglob
cp -r $TEMP/img/* $TARGET/img/
cp -r $TEMP/js/* $TARGET/js/
cp -r $TEMP/less/* $TARGET/less/
Не нашли ничего полезного в Google, есть идеи, в чем проблема?
#!/bin/bash
заголовком?shopt
является встроенным в bash,sh
не имеетshopt
, и сообщение об ошибке выглядит как сообщение об ошибке отdash
. Так что, скорее всего, ошибка здесь заключается в запуске bash-скриптаsh
(который в Ubuntu используетсяdash
по умолчанию). Даже еслиsh
это символическая ссылкаbash
, запуск bash-скрипта сsh
тем же, что и запуск с нимbash
.Ответы:
Чтобы сформировать ответ из комментариев:
Многие по привычке запускают свои сценарии
sh
вместоbash
. Это хорошая практика, если переносимость является проблемой, но многие люди делают это, потому что они копируют то, что видели, не понимая этого.Если ваш сценарий не должен работать в не-настольной системе Linux (например, запуск сценариев оболочки на устройствах Android совсем другой), я рекомендую использовать строку Bash shebang в начале:
Эта строка, когда это первая строка в сценарии, определяет, какой интерпретатор (оболочка, такая как bash или sh, Python и т. Д.) Вызывается для ее выполнения. Если вы используете вышеупомянутую строку, вы получите то же поведение (почти), что и из командной строки, при условии, что вы используете оболочку по умолчанию. Если по причинам переносимости или предпочтений вы используете другую строку shebang, имейте в виду, что вам придется обратиться к документации по оболочке, на которую вы ссылаетесь, даже если оболочка, на которую вы ссылаетесь, является символической ссылкой на Bash.
источник
#!/usr/bin/env bash
поскольку задача env - знать, какой bash использовать (например, если вы его исправили).Вам нужно выйти из zsh и активировать bash, как показано:
Выполнить команду
После чего вы можете реагировать зш:
надеюсь, это поможет
источник
~/.basrc
запускается bash при запуске в этом случае, поэтому нет необходимости вызывать его явно, 3) где выполняется команда OP? и 4) использованиеexec
дважды приводит к потере любых изменений среды, которые вы сделали в начальной оболочке zsh, что не произошло бы, если бы вы просто вызвали bash.