Измените текущий каталог с помощью сценария Bash
-
22-08-2019 - |
Вопрос
Можно ли изменить текущий каталог из скрипта?
Я хочу создать утилиту для навигации по каталогам в Bash.Я создал тестовый скрипт, который выглядит следующим образом:
#!/bin/bash
cd /home/artemb
Когда я выполняю скрипт из оболочки Bash, текущий каталог не меняется.Можно ли вообще изменить текущий каталог оболочки из сценария?
Решение
Вам необходимо преобразовать ваш скрипт в функцию оболочки:
#!/bin/bash
#
# this script should not be run directly,
# instead you need to source it from your .bashrc,
# by adding this line:
# . ~/bin/myprog.sh
#
function myprog() {
A=$1
B=$2
echo "aaa ${A} bbb ${B} ccc"
cd /proc
}
Причина в том, что каждый процесс имеет свой текущий каталог, и когда вы запускаете программу из оболочки, она запускается в новом процессе.Стандартные команды «cd», «pushd» и «popd» встроены в интерпретатор оболочки и влияют на процесс оболочки.
Делая вашу программу функцией оболочки, вы добавляете свою собственную команду в процесс, а затем любое изменение каталога отражается в процессе оболочки.
Другие советы
Когда вы запускаете сценарий, создается новый процесс, который наследует только вашу среду.Когда оно закончится, оно закончится.Ваше нынешнее окружение останется таким, какое оно есть.
Вместо этого вы можете запустить свой скрипт следующим образом:
. myscript.sh
А .
оценит сценарий в текущей среде, поэтому он может быть изменен
В свете нечитабельности и чрезмерной сложности ответов я считаю, что именно это и должен делать запрашивающий.
- добавьте этот скрипт в
PATH
- запустите скрипт как
. scriptname
А .
(точка) гарантирует, что сценарий не будет запущен в дочерней оболочке.
Объединив вышесказанное, вы можете создать псевдоним
alias your_cmd=". your_cmd"
Если вы не хотите писать ведущий "". Каждый раз, когда вы хотите получить свой сценарий в среду оболочки, или если вы просто не хотите помнить, что это должно быть сделано для правильной работы сценария.
Если вы используете bash, вы можете попробовать псевдоним:
в файл .bashrc добавьте эту строку:
alias p='cd /home/serdar/my_new_folder/path/'
когда вы пишете «p» в командной строке, каталог меняется.
Если вы запустите сценарий bash, он будет работать в своей текущей среде или в среде своих дочерних элементов, но никогда в родительской среде.
Если цель состоит в том, чтобы запустить вашу команду:goto.sh /home /test, затем работайте интерактивно в /Дома /тест в одну сторону, - запустить интерактивную подборную Bash в вашем сценарии:
#!/bin/bash
cd $1
exec bash
Таким образом, вы будете находиться в /home/test до тех пор, пока не выйдете (exit или Ctrl+C) из этой оболочки.
С толчок текущий каталог помещается в стек каталогов и заменяется на заданный каталог, попд получить каталог на вершине стека и затем перейти к нему.
pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null
Просто зайдите в
yourusername/.bashrc (or yourusername/.bash_profile on MAC) by an editor
и добавьте этот код рядом с последней строкой:
alias yourcommand="cd /the_path_you_wish"
Затем выйдите из редактора.
Затем введите:
source ~/.bashrc or source ~/.bash_profile on MAC.
теперь вы можете использовать: твоя команда в терминале
Я сделал скрипт для изменения каталога.взглянем: https://github.com/ygpark/dj
В основном мы используем cd..
вернуться из каждого каталога.Я подумал упростить задачу, задав количество каталогов, с которых нужно возвращаться за раз.Реализовать это можно с помощью отдельного файла сценария с помощью команды alias.Например:
код.sh
#!/bin/sh
_backfunc(){
if [ "$1" -eq 1 ]; then
cd ..
elif [ "$1" -eq 2 ]; then
cd ../..
elif [ "$1" -eq 3 ]; then
cd ../../..
elif [ "$1" -eq 4 ]; then
cd ../../../..
elif ["$1" -eq 10]; then
cd /home/arun/Documents/work
fi
}
alias back='_backfunc'
После использования source code.sh
в текущей оболочке вы можете использовать:
$back 2
вернуться на два шага назад из текущего каталога.Подробно описано выше здесь.Там также объясняется, как поместить код в ~/.bashrc, чтобы каждая новая открытая оболочка автоматически имела эту новую команду псевдонима.Вы можете добавить новую команду для перехода к определенным каталогам, изменив код, добавив больше if conditions
и разные аргументы.Вы также можете перетащить код из git. здесь.
Мне такой подход проще.
Предположим, что на личном iMac, где вы являетесь администратором, в каталоге по умолчанию при открытии командного окна /Users/jdoe это будет каталог, в который нужно перейти:/Users/jdoe/Desktop/Mongo/db.3.2.1/bin.
Вот шаги, которые могут выполнить работу:
- vi mongobin, в котором я ввел:
cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin
в качестве первой линии. chmod 755 mongobin
source mongobin
pwd
Вуаля!
Я также создал утилиту под названием козел который вы можете использовать для облегчения навигации.
Вы можете просмотреть исходный код на GitHub.
По состоянию на v2.3.1 тот обзор использования выглядит так:
# Create a link (h4xdir) to a directory:
goat h4xdir ~/Documents/dev
# Follow a link to change a directory:
cd h4xdir
# Follow a link (and don't stop there!):
cd h4xdir/awesome-project
# Go up the filesystem tree with '...' (same as `cd ../../`):
cd ...
# List all your links:
goat list
# Delete a link (or more):
goat delete h4xdir lojban
# Delete all the links which point to directories with the given prefix:
goat deleteprefix $HOME/Documents
# Delete all saved links:
goat nuke
# Delete broken links:
goat fix
Мне нравится делать одно и то же для разных проектов, не запуская новую оболочку.
В твоем случае:
cd /home/artemb
Сохраните the_script как:
echo cd /home/artemb
Затем запустите его с помощью:
\`./the_script\`
Затем вы попадаете в каталог, используя ту же оболочку.
Добавьте ниже строку cd в свой сценарий оболочки:
exec $SHELL
Объявите свой путь:
PATH='/home/artemb'
cd ${PATH}