почему функция 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 .

  • Командная строка для перехода в каталог, переданный командой
  • Воспроизведение аудио CD 1: 1
  • Как я могу скопировать WAV-файл из аудио компакт-диска и проверить его?
  • Есть ли инструмент для чтения CD / DVD-дисков для Linux?
  • Обнаружение поврежденного аудио CD
  • Как cd .. знает, какой каталог ..?
  • Можно ли добавить пароль для перемещения или копирования определенных файлов в Linux?
  • Соответствие POSIX программы cd?
  • 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 - лучшая ОС в мире.