web-dev-qa-db-ja.com

Bashスクリプトから現在のディレクトリを変更する

スクリプトから現在のディレクトリを変更することは可能ですか?

Bashでディレクトリナビゲーション用のユーティリティを作成したい。次のようなテストスクリプトを作成しました。

#!/bin/bash
cd /home/artemb

Bashシェルからスクリプトを実行しても、現在のディレクトリは変わりません。スクリプトから現在のシェルディレクトリを変更することはまったく可能ですか?

169
artemb

スクリプトをシェル関数に変換する必要があります。

#!/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」はシェルインタープリターに組み込まれているため、シェルプロセスに影響します。

プログラムをシェル関数にすることにより、独自のインプロセスコマンドを追加し、ディレクトリの変更がシェルプロセスに反映されます。

156
winden

スクリプトを開始すると、環境のみを継承する新しいプロセスが作成されます。終了すると、終了します。現在の環境はそのままです。

代わりに、次のようにスクリプトを開始できます。

. myscript.sh

.は現在の環境でスクリプトを評価するため、変更される可能性があります

197
Norbert Hartl

読みにくいと答えの複雑さを考慮して、私はこれが要求者がすべきことだと信じています

  1. そのスクリプトをPATHに追加します
  2. スクリプトを. scriptnameとして実行します

.(ドット)は、スクリプトが子シェルで実行されないようにします。

53
Albert

上記をまとめると、エイリアスを作成できます

alias your_cmd=". your_cmd"

先頭の「。」を書きたくない場合スクリプトをシェル環境にソースするたびに、または単に覚えたくない場合は、スクリプトが正しく機能するために行う必要があります。

38
MergerMan

Bashを使用している場合、エイリアスを試すことができます:

.bashrcファイルに次の行を追加します。

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

コマンドラインで「p」を書き込むと、ディレクトリが変更されます。

30
akarca

Bashスクリプトを実行すると、現在の環境またはその子の環境で動作し、親では動作しません。

目標がコマンドの実行である場合:goto.sh/home/test次に、/ home/testでインタラクティブに作業する方法の1つは、スクリプト内でbashインタラクティブサブシェルを実行することです:

#!/bin/bash
cd $1
exec bash

この方法では、このシェルを終了(exitまたはCtrl + C)するまで/ home/testになります。

16
philippe lhardy

pushdを使用すると、現在のディレクトリがディレクトリスタックにプッシュされ、指定されたディレクトリpopdスタックの一番上にあるディレクトリを取得し、そのディレクトリに変更します。

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

単に行く

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を使用できるようになりました

4
ThangTD

基本的に、cd..を使用して、すべてのディレクトリから戻ってきます。一度に戻る必要のあるディレクトリの数を指定することで、より簡単にすることを考えました。 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 

現在のディレクトリから2ステップ戻ります。 here で詳細に説明されています。また、コードを〜/ .bashrcに配置する方法についても説明します。これにより、開いたすべての新しいシェルが自動的にこの新しいエイリアスコマンドを持つようになります。 if conditionsと異なる引数を追加してコードを変更することにより、特定のディレクトリに移動する新しいコマンドを追加できます。また、gitからコードを here でプルすることもできます。

3
Arun Chettoor

ディレクトリを変更するスクリプトを作成しました。ご覧ください: https://github.com/ygpark/dj

3
Joel

このアプローチは私にとって簡単です。

あなたが管理者である個人の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

出来上がり!

0
Daniel C. Deng

また、ナビゲーションを容易にするために使用できる 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
0

新しいシェルを起動せずに、異なるプロジェクトに対して同じことをするのが好きです。

あなたの場合:

cd /home/artemb

The_scriptを次の名前で保存します。

echo cd /home/artemb

次に、それを起動します:

\`./the_script\`

次に、同じシェルを使用してディレクトリに移動します。

0
DrGamma

パスを宣言:

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

これをシェルスクリプトの以下のcd行に追加します。

exec $Shell
0
Alberto Corella