На этот вопрос уже есть ответ здесь:
Я использую сценарий FileCreator:
#!/bin/bash
echo "Welcome to the file creator! Please type the directory name:"
read dirName
mkdir $dirName
#Now I want to change directory to that new $dirName that will be run from Terminal.
Мой вопрос сейчас , как изменить путь к этому новому каталогу dirName
, который отображается в Терминале. Итак, в конце путь должен быть: / home / my_user_name / SCRIPTS / dirName
, когда я запускаю этот скрипт ...
Пожалуйста, просто предложение? :)
Команда cd
изменяет в каком каталоге вы находитесь . Запустите help cd
для деталей.
Если dirName
- это переменная оболочки , содержащая имя каталога, в который вы хотите перейти, тогда
cd -- "$dirName"
перейдет туда. Например, если вы начинаете с /home/my_user_name/SCRIPTS
, а переменная dirName
содержит текст foo
, то эта команда приведет вас к /home/my_user_name/SCRIPTS/foo
.
Если вы всегда хотите, чтобы dirName
интерпретировался как относительный путь в /home/my_user_name/SCRIPTS
, независимо от того, откуда пользователь запускает ваш скрипт, используйте:
cd -- "/home/my_user_name/SCRIPTS/$dirName"
Возможно, вы заметили ведущий аргумент --
и использование цитаты :
В скрипте при передаче пользовательского ввода в качестве аргументов команде, которая принимает опции , начиная с -
или --
, обычно хорошей идеей будет сначала передать опцию --
. Большинство команд, которые принимают аргументы имени файла, поддерживают этот синтаксис (хотя вы всегда должны проверять). Это означает, что все последующие аргументы должны интерпретироваться как имена файлов, а не как опции.
Чтобы понять это, попробуйте запустить ls -l
и попробуйте запустить ls -- -l
. Обычно вам не нужно использовать аргумент --
при вводе команд вручную. Но в сценарии, который передает значение неанализованного ввода в команду, он часто используется.
В обеих командах я использовал двойные кавычки ("
"
). Обычно это то, что вам нужно при раскрытии переменной, содержащей имя файла.
Как если бы вы вообще не использовали кавычки, но в отличие от одинарных кавычек ('
'
), двойные кавычки допускают расширение параметра . Таким образом, они не мешают расширению $dirName
до значения, которое было присвоено ему командой read
. Однако, в отличие от использования кавычек вообще, а не одиночных кавычек, двойные кавычки предотвращают разбиение слов . Таким образом, если переменная содержит пробельные символы (или символов, присутствующих в IFS
, , если это было установлено ), она все равно будет работать правильно.
См. Также 3.1.2 Цитирование в Справочном руководстве Bash .
Я рекомендую также использовать двойные кавычки в вашей команде mkdir
и, вероятно, также --
:
mkdir -- "$dirName"
Обратите внимание, что изменение текущего каталога в Сценарий оболочки не приводит к изменению вызывающего текущего процесса каталога . Это сделано специально (и применяется в большинстве, если не во всех операционных системах, включая Windows). Когда программа запускает другую программу, она не ожидает, что ее собственный текущий каталог будет изменен.
Каждая программа имеет свою собственную среду и свой собственный текущий каталог. Когда вы запускаете новую программу, она наследует ее от программы, которая ее запустила, но у нее есть собственная копия. Когда дочерний процесс изменяет свой текущий каталог, то есть не отражается в родительском процессе.
Часто, когда вы хотите изменить каталог для вызывающей стороны, правильным подходом является пересмотреть ваш дизайн. Вы действительно нуждаетесь в этом?
По сути, единственная ситуация, когда разумно изменить каталог для вызывающей стороны, - это когда ваш сценарий на самом деле представляет собой просто список команд, которые также будут запускаться непосредственно вызывающей стороной. В этом случае вы можете использовать сценарий вместо его запуска . Например, предположим, что вы в настоящее время запускаете свой сценарий с помощью команды:
./my_script
Тогда вы можете вместо этого source сделать это с помощью:
. ./my_script
Этот альтернативный синтаксис также поддерживаются:
source ./my_script
Оболочка Bash поддерживает встроенные функции .
и source
, и они эквивалентны. (Запустите help .
или help source
для получения подробной информации.)
Это заставляет все команды в вашем скрипте выполняться в текущей оболочке , а не в новой оболочке (которая является что происходит, когда вы на самом деле запускаете скрипт оболочки).