スクリプトから現在のディレクトリを変更することは可能ですか?
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次に、/ home/testでインタラクティブに作業する方法の1つは、スクリプト内でbashインタラクティブサブシェルを実行することです:
#!/bin/bash
cd $1
exec bash
この方法では、このシェルを終了(exitまたはCtrl + C)するまで/ home/testになります。
pushdを使用すると、現在のディレクトリがディレクトリスタックにプッシュされ、指定されたディレクトリpopdスタックの一番上にあるディレクトリを取得し、そのディレクトリに変更します。
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.
ターミナルでyourcommandを使用できるようになりました
基本的に、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 でプルすることもできます。
ディレクトリを変更するスクリプトを作成しました。ご覧ください: https://github.com/ygpark/dj
このアプローチは私にとって簡単です。
あなたが管理者である個人のiMacで、コマンドウィンドウを開いたときのデフォルトディレクトリ/ Users/jdoeで、これが/Users/jdoe/Desktop/Mongo/db.3.2.1に移動するディレクトリであるとします。/bin。
これらは仕事をすることができるステップです:
cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin
。chmod 755 mongobin
source mongobin
pwd
出来上がり!
また、ナビゲーションを容易にするために使用できる 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
新しいシェルを起動せずに、異なるプロジェクトに対して同じことをするのが好きです。
あなたの場合:
cd /home/artemb
The_scriptを次の名前で保存します。
echo cd /home/artemb
次に、それを起動します:
\`./the_script\`
次に、同じシェルを使用してディレクトリに移動します。
パスを宣言:
PATH='/home/artemb'
cd ${PATH}
これをシェルスクリプトの以下のcd行に追加します。
exec $Shell