Изменить текущий каталог из Bash-скрипта

Можно ли изменить текущий каталог из скрипта?

Я хочу создать утилиту для навигации по каталогам в Bash. Я создал тестовый скрипт, который выглядит следующим образом:

#!/bin/bash
cd /home/artemb

Когда я выполняю скрипт из оболочки Bash, текущий каталог не меняется. Можно ли вообще изменить текущий каталог оболочки из скрипта?

Ответ 1

Вам нужно преобразовать script в функцию оболочки:

#!/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" встроены в интерпретатор оболочки, чтобы они влияли на процесс оболочки.

Предоставляя вашей программе функцию оболочки, вы добавляете свою собственную команду in-process, а затем любое изменение каталога находит отражение в процессе оболочки.

Ответ 2

При запуске script создается новый процесс, который только наследует вашу среду. Когда он заканчивается, он заканчивается. Ваша текущая среда остается такой, как есть.

Вместо этого вы можете запустить свой script следующим образом:

. myscript.sh

. будет оценивать script в текущей среде, поэтому он может быть изменен

Ответ 3

В свете нечитаемости и чрезмерного удовлетворения ответов, я считаю, что это то, что должен сделать запросчик

  • добавьте script в PATH
  • запустите script как . scriptname

В . (точка) убедитесь, что script не запущен в дочерней оболочке.

Ответ 4

Объединив выше, вы можете сделать псевдоним

alias your_cmd=". your_cmd"

если вы не хотите писать ведущие ".". каждый раз вы хотите отправить свой script в среду оболочки, или если вы просто не хотите помнить, что это должно быть сделано для корректной работы script.

Ответ 5

Если вы используете bash, вы можете попробовать псевдоним:

в файл .bashrc добавьте эту строку:

alias p='cd /home/serdar/my_new_folder/path/'

когда вы пишете "p" в командной строке, он изменит каталог.

Ответ 6

Если вы запустите bash script, то он будет работать в своей текущей среде или на своих дочерних элементах, никогда не на родительском.

Если цель заключается в выполнении вашей команды: goto.sh/home/test Затем интерактивно работать в /home/test одним способом - запустить интерактивную подоболочку bash в вашем script:

#!/bin/bash
cd $1
exec bash

Таким образом вы будете в /home/test, пока не выйдете (выйдите или Ctrl + C) этой оболочки.

Ответ 7

С помощью pushd текущий каталог помещается в стек каталога, и он изменяется на данный каталог, popd получает каталог поверх стека и меняет его на он.

pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null

Ответ 8

Просто перейдите к

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.

теперь вы можете использовать: yourcommand в терминале

Ответ 10

В основном мы используем cd.. для возврата из любого каталога. Я решил сделать это более легким, указав количество каталогов, с которыми вам нужно вернуться за раз. Вы можете реализовать это, используя отдельный файл script, используя команду alias. Например:

code.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, чтобы каждая новая оболочка открывала автоматически эту новую команду alias. Вы можете добавить новую команду, чтобы перейти к конкретным каталогам, изменив код, добавив больше if conditions и различные аргументы. Вы также можете вывести код из git поверх здесь.

Ответ 11

Этот подход проще для меня.

Предположим, что на персональном iMac, где вы являетесь администратором, в каталоге по умолчанию, когда открывается окно командной строки, /Users/jdoe, это будет каталог для перехода: /Users/jdoe/Desktop/Mongo/db.3.2.1/бен.

Вот шаги, которые могут сделать работу:

  1. vi mongobin, в который я ввел: cd/Users/jdoe/Desktop/Mongo/db.3.2.1/bin в качестве первой строки.
  2. chmod 755 mongobin
  3. source mongobin
  4. pwd

Вуаля!

Ответ 12

Мне нравится делать одно и то же для разных проектов без запуска новой оболочки.

В твоем случае:

cd /home/artemb

Сохраните the_script как:

echo cd /home/artemb

Затем запустите его:

\'./the_script\'

Затем вы попадаете в каталог с помощью той же оболочки.

Ответ 13

Я также создал утилиту под названием goat, которую вы можете использовать для упрощения навигации.

Вы можете просмотреть исходный код на 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

Ответ 14

Добавьте ниже строку cd в свой шеллскрипт так:

exec $SHELL

Ответ 15

Объявите свой путь:

PATH='/home/artemb'     
cd ${PATH}