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

StackOverflow https://stackoverflow.com/questions/874452

  •  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

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

В свете нечитабельности и чрезмерной сложности ответов я считаю, что именно это и должен делать запрашивающий.

  1. добавьте этот скрипт в PATH
  2. запустите скрипт как . 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.

Вот шаги, которые могут выполнить работу:

  1. vi mongobin, в котором я ввел:cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin в качестве первой линии.
  2. chmod 755 mongobin
  3. source mongobin
  4. 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}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top