Я хочу запустить скрипт, чтобы просто изменить текущий рабочий каталог:
#!/bin/bash
cd web/www/project
Но после того, как я запустил его, текущий pwd остается неизменным! Как я могу это сделать?
Я хочу запустить скрипт, чтобы просто изменить текущий рабочий каталог:
#!/bin/bash
cd web/www/project
Но после того, как я запустил его, текущий pwd остается неизменным! Как я могу это сделать?
Ответы:
Это ожидаемое поведение, которое уже обсуждалось несколько раз.
Сценарий выполняется в подоболочке и не может изменить рабочий каталог родительской оболочки. Его эффекты теряются, когда он заканчивается.
Для изменения каталога постоянно следует источник сценарий, как и в
. ./script
source ./scriptже?
.и sourceравны в баш. 2. нам не нужно использовать ./перед именем файла, если он находится в том же каталоге. Это нормально, чтобы запустить только это:. script
Для небольших задач, таких как эта, вместо создания сценария создайте псевдоним, подобный этому,
$ alias cdproj='cd /dir/web/www/proj'
Вы должны добавить это в свой .bashrcфайл, если хотите, чтобы он был установлен для каждой интерактивной оболочки.
Теперь вы можете запустить это как $ cdproj.
eval `./script` или eval $(./script)для выполнения этих команд. Это общий подход для команд, которым необходимо обновить среду вызывающей оболочки.
evalподход.
exec bashв концеСкрипт bash работает в текущей среде или в дочерних, но никогда в родительской среде.
Однако этот вопрос часто задают, потому что кто-то хочет остаться в приглашении bash в определенном каталоге после выполнения сценария bash из другого каталога.
Если это так, просто запустите дочерний экземпляр bash в конце скрипта:
#!/usr/bin/env bash
cd desired/directory
exec bash
Это создает новую подоболочку. Введите, exitчтобы вернуться к первой оболочке, где скрипт был изначально запущен.
execобычно считается последним средством негодяя .. :)
exit(или Ctrl + D), вам придется делать это 11–21 раз. (2) Другой недостаток использования исполняемого скрипта состоит в том, что если вы установите какие-либо параметры оболочки (например, dotglobили globstar) в сеансе интерактивной оболочки, вы потеряете их, потому что запускаете новую оболочку.
Хотя есть ответы, которые выполняют именно то действие, которое вы хотите, более стандартным методом для этой цели является создание символической ссылки:
ln -s ~/web/www/project proj #use full path to dir!
Тогда вы можете cdв каталог, используя имя proj:
cd proj
Этот метод более гибкий, потому что вы можете получить доступ к файлам, используя короткое имя без cd:
ls proj/ #note the endslash!
vim proj/file.x
В зависимости от того, что вы собираетесь делать, другим решением может быть создание функции вместо скрипта.
Пример:
Создайте функцию в файле, скажем /home/aidin/my-cd-script:
function my-cd() {
cd /to/my/path
}
Затем включите его в свой файл bashrcили zshrcфайл:
# Somewhere in rc file
source /home/aidin/my-cd-script
Теперь вы можете использовать его как команду:
$ my-cd
Почему бы не использовать «exec», чтобы сделать именно то, что я хочу.
#!/bin/bash
cd someplace
exec bash
~/someplace
exit(или Ctrl + D), вам придется делать это 11–21 раз.
dotglobили globstar), вы потеряете их, потому что запускаете новую оболочку. … (Продолжение)
Вы можете сделать это с помощью функции или с помощью &&. Примеры ниже устанавливают Zabbix и создают файл со строкой внутри него.
Пример:
#!/bin/bash
# Create Function:
installZabbix(){
cd /usr/src/zabbix-4.2.4;
./configure --enable-agent;
make install;
cd /usr/src/;
>file;
echo "Hi, this is a file." >>file;
}
# Call the function:
installZabbix
или:
#!/bin/bash
cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file
returnдля выхода из сценария, полученного таким способом, а неexit- они похожи на функции оболочки иexitвыйдут из оболочки, которая создала сценарий.