В сценарии bash, как я могу перейти в каталог, имя которого хранится в переменной ? [дубликат]

На этот вопрос уже есть ответ здесь:

Я использую сценарий 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 , когда я запускаю этот скрипт ...

Пожалуйста, просто предложение? :)

3
задан 16 January 2017 в 00:18

1 ответ

Команда 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 для получения подробной информации.)

Это заставляет все команды в вашем скрипте выполняться в текущей оболочке , а не в новой оболочке (которая является что происходит, когда вы на самом деле запускаете скрипт оболочки).

8
ответ дан 1 December 2019 в 13:16

Другие вопросы по тегам:

Похожие вопросы: