Я пишу сценарий для копирования некоторых файлов вокруг и пытаюсь использовать shopt -s dotglob
позволять CP скопировать dotfiles как .jshint
и этажерка.
Я могу работать shopt -s dotglob
непосредственно в ударе запрашивают без ошибки. Однако выполнение сценария бросает ошибку:
script.sh: 81: script.sh: shopt: not found
Я запускаю этот скрипт в оболочке удара с заголовком хижины #!/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, никакая идея, что проблема здесь?
Чтобы сформировать ответ из комментариев:
Многие люди по привычке запускают свои скрипты с помощью sh
вместо bash
. Это хорошая практика, если речь идет о переносимости, но многие люди делают это потому, что копируют то, что они видели, не понимая этого.
Если ваш скрипт не должен запускаться на нерабочей системе Linux (например, запуск скриптов оболочки на Android-устройствах совсем другой), я рекомендую использовать в начале строку Bash shebang:
#!/bin/bash
Эта строка, когда это первая строка в скрипте, определяет, какой интерпретатор (shell, такой как bash или sh, Python, и т.д.) вызывается для его выполнения. Если вы используете вышеуказанную строку, вы получите то же самое поведение (почти), что и из командной строки, предполагая, что вы используете оболочку по умолчанию. Если по причинам переносимости или предпочтений вы используете другую строку shebang, знайте, что вам придется обратиться к документации на оболочку, на которую вы ссылались, , даже если оболочка, на которую вы ссылаетесь, является симлинкией к Bash.
Вам нужно выйти из zsh и активировать bash, как показано:
exec bash
Выполните команду
source ~/.bashrc
, после чего вы можете реактивировать zsh:
exec zsh
Надеюсь, что это поможет