Сценарий для изменения текущего каталога (CD, pwd)

Как насчет более короткой версии 7z и комбинация tar с помощью стандарта и каналов?

# 7z x -so my-compressed-tarball.tar.bz2| tar xf -
46
19.12.2011, 22:44
12 ответов

Это - ожидаемое поведение и уже обсуждало несколько раз.

Скрипт запущен в подоболочке и не может изменить родительскую оболочку рабочий каталог. Его эффекты потеряны, когда это заканчивается.

Для изменения каталога постоянно, необходимо получить сценарий, как в

. ./script
66
27.01.2020, 19:34
  • 1
    @Sony: Обратите внимание, что необходимо использовать return сбежать из сценария, полученного таким образом, нет exit - они похожи на функции оболочки, и exit выйдет из оболочки, которая получила сценарий. –  Charles Stewart 19.12.2011, 10:19
  • 2
    @CharlesStewart На самом деле, я не знаком с полученными сценариями.Спасибо! –  Sony Santos 19.12.2011, 14:56
  • 3
    source ./script то же? –  amyassin 19.12.2011, 15:04
  • 4
    @amyassin: да, это –  enzotib 19.12.2011, 15:05
  • 5
    1. . и source равны по удару. 2. мы не должны использовать ./ перед именем файла, если это находится в том же каталоге. Нормально выполнять только это: . script –  sobi3ch 16.06.2016, 18:02

Для небольших задач, таких как это, вместо того, чтобы создать сценарий, создают псевдоним как это,

$ alias cdproj='cd /dir/web/www/proj'

Необходимо добавить это к Вашему .bashrc файл, если Вы хотите это набор для каждой интерактивной оболочки.

Теперь можно выполнить это как $ cdproj.

23
27.01.2020, 19:34
  • 1
    Вы можете также иметь эхо сценария команды, которые будут выполняться и затем использовать eval `./script` или eval $(./script) выполнить те команды. Это - общий подход для команд, которые должны обновить среду оболочки вызова. –  Keith Thompson 20.12.2011, 12:41
  • 2
    Просто будьте очень осторожны относительно того, что Вы производите, если Вы собираетесь пойти 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
8
27.01.2020, 19:34

Если Вы изменяетесь между каталогами далеко в файловой системе. Я рекомендую автопереход.

4
27.01.2020, 19:34

Просто напишите в PWDи экспортируйте его в свой скрипт, и изменение сохранится.

export PWD=/your/desired/directory
0
27.01.2020, 19:34

Используйте 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
26
28.07.2021, 14:42

В зависимости от того, что вы собираетесь делать, другим решением может быть создание функции вместо скрипта.

Пример:

Создать функцию в файле,скажем/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
18
20.08.2021, 13:30

Почему бы не использовать "exec", чтобы сделать именно то, что я хочу.

#!/bin/bash

cd someplace
exec bash

~/someplace
-2
20.08.2021, 13:30

Это можно сделать с помощью функции или с помощью && В приведенных ниже примерах устанавливается 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
-2
20.08.2021, 13:30

Для меня самым удобным и гибким подходом было сочетание псевдонима и скрипта:

создать скрипт с произвольной логикой

Здесь я создаю скрипт, который переходит в каталог и активирует соответствующую среду 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, чтобы немедленно получать последние изменения и т. д.... все стандартные вещи вы делаете, когда продолжаете работать над конкретным проектом.

1
20.08.2021, 13:30

Это объединяет ответ Сержа с несвязанным ответом Дэвида . Он изменяет каталог, а затем вместо принудительной оболочки bash запускает оболочку пользователя по умолчанию . Однако для определения оболочки по умолчанию требуются как getent, так и /etc/passwd.

#!/usr/bin/env bash
cd desired/directory
USER_SHELL=$(getent passwd <USER> | cut -d : -f 7)
$USER_SHELL

Конечно, это все тот же недостаток создания вложенной оболочки.

-1
20.08.2021, 13:30

Так как я много функционализировал свой компакт-диск, я сделал это:
добавил эту строку в ~/.bashrc

alias cd='. my_cd'

и мой _компакт-диск — это скрипт в моем $PATH, который фактически выполняет cd.
Чтобы предотвратить рекурсивные вызовы, фактический cdв сценарии написан \cd, что означает «использует устаревший компакт-диск, а не псевдоним».

Под функциональными я подразумеваю

  1. перейти в домашнюю директорию существующего проекта, просто нажав cd на его код.
  2. просто cdв подкаталоге проекта приводит меня к домашнему каталогу проекта, а не к моему дому.
  3. cdк несуществующему проекту (имя проекта имеет номенклатуру ):предложить создать окружение проекта.
  4. cdк проекту, оказавшемуся в архиве :попросить оживить его или просто перенести в архив.

иначе работает как cd.

1
20.08.2021, 13:30

Теги

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