Как насчет более короткой версии 7z и комбинация tar с помощью стандарта и каналов?
# 7z x -so my-compressed-tarball.tar.bz2| tar xf -
Это - ожидаемое поведение и уже обсуждало несколько раз.
Скрипт запущен в подоболочке и не может изменить родительскую оболочку рабочий каталог. Его эффекты потеряны, когда это заканчивается.
Для изменения каталога постоянно, необходимо получить сценарий, как в
. ./script
Для небольших задач, таких как это, вместо того, чтобы создать сценарий, создают псевдоним как это,
$ alias cdproj='cd /dir/web/www/proj'
Необходимо добавить это к Вашему .bashrc
файл, если Вы хотите это набор для каждой интерактивной оболочки.
Теперь можно выполнить это как $ cdproj
.
eval `./script`
или eval $(./script)
выполнить те команды. Это - общий подход для команд, которые должны обновить среду оболочки вызова.
– Keith Thompson
20.12.2011, 12:41
eval
подход.
– jw013
14.09.2012, 23:08
В то время как существуют ответы, которые делают точное действие, которое Вы хотите, более стандартный метод для такой цели состоит в том, чтобы создать символьную ссылку:
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
Если Вы изменяетесь между каталогами далеко в файловой системе. Я рекомендую автопереход.
Просто напишите в PWD
и экспортируйте его в свой скрипт, и изменение сохранится.
export PWD=/your/desired/directory
exec bash
в концеСценарий bash работает в своем текущем окружении или в окружении своих дочерних окружений, но никогда на родительском окружении.
Однако этот вопрос часто задают потому, что хотят остаться в приглашении bash в определенном каталоге после выполнения сценария bash из другого каталога.
В этом случае просто выполните дочерний экземпляр bash в конце сценария:
#!/usr/bin/env bash
cd desired/directory
exec bash
Это создаст новую подпрограмму. Введите Ctrl+D или exit
, чтобы вернуться в первую оболочку, в которой изначально был запущен сценарий.
По крайней мере, в новых версиях bash
, exec
в последней строке больше не требуется. Более того, сценарий можно заставить работать с любой предпочитаемой оболочкой, используя переменную окружения $SHELL
. В результате получается:
#!/usr/bin/env bash
cd desired/directory
$SHELL
В зависимости от того, что вы собираетесь делать, другим решением может быть создание функции вместо скрипта.
Пример:
Создать функцию в файле,скажем/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
Это можно сделать с помощью функции или с помощью && В приведенных ниже примерах устанавливается 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
Для меня самым удобным и гибким подходом было сочетание псевдонима и скрипта:
Здесь я создаю скрипт, который переходит в каталог и активирует соответствующую среду Python. Расположение скриптов показано в /path/to/workon_myproj.sh
.
#!/usr/bin/env bash
cd $HOME/workspace/myproj
source.venv/bin/activate
alias workon_myproj='source /path/to/workon_myproj.sh'
Добавьте определение псевдонима в соответствующий стартовый файл оболочки, например. .profile
, .bashrc
или .zshrc
.
Теперь вы можете просто выполнить workon_myproj
в оболочке, которая доставит содержимое вашего скрипта в нужный каталог.
Вы можете улучшить свой сценарий, чтобы он принимал аргумент, чтобы он работал с несколькими проектами в определенном рабочем каталоге, или комбинировать его с git pull
, чтобы немедленно получать последние изменения и т. д.... все стандартные вещи вы делаете, когда продолжаете работать над конкретным проектом.
Это объединяет ответ Сержа с несвязанным ответом Дэвида . Он изменяет каталог, а затем вместо принудительной оболочки bash запускает оболочку пользователя по умолчанию . Однако для определения оболочки по умолчанию требуются как getent
, так и /etc/passwd
.
#!/usr/bin/env bash
cd desired/directory
USER_SHELL=$(getent passwd <USER> | cut -d : -f 7)
$USER_SHELL
Конечно, это все тот же недостаток создания вложенной оболочки.
Так как я много функционализировал свой компакт-диск, я сделал это:
добавил эту строку в ~/.bashrc
alias cd='. my_cd'
и мой _компакт-диск — это скрипт в моем $PATH
, который фактически выполняет cd
.
Чтобы предотвратить рекурсивные вызовы, фактический cd
в сценарии написан \cd
, что означает «использует устаревший компакт-диск, а не псевдоним».
Под функциональными я подразумеваю
cd
в подкаталоге проекта приводит меня к домашнему каталогу проекта, а не к моему дому. cd
к несуществующему проекту (имя проекта имеет номенклатуру ):предложить создать окружение проекта. cd
к проекту, оказавшемуся в архиве :попросить оживить его или просто перенести в архив. иначе работает как cd
.
return
сбежать из сценария, полученного таким образом, нетexit
- они похожи на функции оболочки, иexit
выйдет из оболочки, которая получила сценарий. – Charles Stewart 19.12.2011, 10:19source ./script
то же? – amyassin 19.12.2011, 15:04.
иsource
равны по удару. 2. мы не должны использовать./
перед именем файла, если это находится в том же каталоге. Нормально выполнять только это:. script
– sobi3ch 16.06.2016, 18:02