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