Я хочу запустить скрипт, чтобы просто изменить текущий рабочий каталог:
#!/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
выйдут из оболочки, которая создала сценарий.