почему функция cd в скрипте не работает

Я написал сценарий с целью изменения каталога, а затем сканирования файла.

#!/bin/bash model_dir=/mypath function chdir () { cd $1 } chdir ${model_dir}/config if [[ ! -s *.cfg ]] then echo `date` "configure file does not exist" exit 1 fi 

Я не понимаю, почему мой текущий каталог не изменяется после выполнения этого скрипта с помощью source myscript.sh .

  • Как сделать файлы WAV с качеством CD с помощью avconv?
  • gnome-terminal: отслеживать каталог на новой вкладке
  • Как определить, доступен ли носитель cd / dvd
  • Как cd .. знает, какой каталог ..?
  • Как перенаправить вывод на cd?
  • как добавить пользовательскую опцию в команду mkdir
  • Команды для чтения и извлечения компакт-диска?
  • Как перенаправить вывод на cd?
  • Какая 2-буквенная команда POSIX отличается от всех остальных?
  • Как проверить, почему cdrom не может быть открыт исключительно
  • в режиме «хорошо» - «дао», «-ао», «-тао» и «-разовый» режим записи для wodim
  • Блокировка привода CD / DVD (предотвращение извлечения)
  • 2 Solutions collect form web for “почему функция cd в скрипте не работает”

    Ваш скрипт и особенно его внутренние команды cd отлично работают при вызове из bash с использованием либо source либо эквивалента . команды.

    Основная проблема заключается в том, что, как уже было сказано в комментарии @adonis, ваша оболочка, после правильного изменения ее каталога, выйдет, если файл с именем «* .cfg» не существует, что очень сомнительно.

    Как я думаю, вы хотите использовать * .cfg как шаблон, вот как я немного изменил бы ваш скрипт, чтобы он работал, как ожидалось:

     #!/bin/bash # Note that the shebang is useless for a sourced script model_dir=/mypath chdir() { # use either function or (), both is a non portable syntax cd $1 } chdir ${model_dir}/config if [ ! -s *.cfg ]; then # Single brackets here for the shell to expand *.cfg echo $(date) "configure file does not exist" exit 1 # dubious in a sourced script, it will end the main and only shell interpreter fi 

    Это потому, что команда cd выполняется внутри скрипта, а не в текущей среде оболочки. Если вы хотите, чтобы сценарий запускался в текущей среде оболочки, запустите его так:

     . /path/to/script.sh 

    Вывод из моего собственного рабочего примера вашего скрипта с помощью pwd вместо вашего оператора if :

     Jamey@CNU326BXDX ~ $ /usr/local/bin/this.sh /cygdrive/c/users/jamey/downloads Jamey@CNU326BXDX ~ $ . /usr/local/bin/this.sh /cygdrive/c/users/jamey/downloads Jamey@CNU326BXDX /cygdrive/c/users/jamey/downloads $ 

    Обратите внимание на текущий рабочий каталог после запуска скрипта во второй раз.

    Linux и Unix - лучшая ОС в мире.