スクリプトから現在のディレクトリを変更することはできますか?
Bashでディレクトリナビゲーション用のユーティリティを作成したい。次のようなテストスクリプトを作成しました。
#!/bin/bash
cd /home/artemb
Bashシェルからスクリプトを実行しても、現在のディレクトリは変更されません。スクリプトから現在のシェルディレクトリを変更することはまったく可能ですか?
スクリプトから現在のディレクトリを変更することはできますか?
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
.
それは変更される場合がありますので、現在の環境でスクリプトを評価します
.sh
拡張機能は完全にewwです。それらを使用しないでください。
解読不能で複雑すぎるので、これは要求者がすべきことだと思います
PATH
. scriptname
.
(ドット)が必ずスクリプトは、子シェルで実行されるのではないでしょう。
上記を組み合わせて、エイリアスを作成できます
alias your_cmd=". your_cmd"
先頭の「。」を書きたくない場合 スクリプトをシェル環境にソーシングするたびに、または単に覚えておきたくない場合は、スクリプトが正しく機能するためにこれを行う必要があります。
~/.bash_aliases
は、Bashの起動時に常に提供されるわけではありません。
bashスクリプトを実行すると、現在の環境またはその子の環境で動作し、親では動作しません。
目標がコマンドの実行である場合:goto.sh / home / test次に/ home / testでインタラクティブに作業する1つの方法は、スクリプト内でbashインタラクティブサブシェルを実行することです。
#!/bin/bash
cd $1
exec bash
このようにして、このシェルを終了(exitまたはCtrl + C)するまで/ home / testに入ります。
ディレクトリを変更するスクリプトを作成しました。見てください:https : //github.com/ygpark/dj
基本的に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ステップ戻ります。詳細に説明ここます。また、コードを〜/ .bashrcに配置する方法についても説明されているため、新しいシェルを開くたびに、この新しいエイリアスコマンドが自動的に追加されます。さらにif conditions
別の引数を追加してコードを変更することにより、特定のディレクトリに移動する新しいコマンドを追加できます。ここからgitからコードをプルすることもできます。
このアプローチは私にとっては簡単です。
あなたが管理者である個人のiMacで、コマンドウィンドウを開いたときのデフォルトディレクトリ/ Users / jdoeの下にあるとします。これは、次のディレクトリに移動します:/Users/jdoe/Desktop/Mongo/db.3.2.1 /置き場。
これらは仕事をすることができるステップです:
cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin
最初の行として。chmod 755 mongobin
source mongobin
pwd
出来上がり!
山羊というユーティリティも作成しましたナビゲーションを簡単にするために使用できるという。
GitHubでソースコードを表示できます。
# 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
pushd
(場合によっては>/dev/null
その出力を抑制するためにリダイレクトされる)を使用するとcd
、後でで前のディレクトリに戻ることができますpopd
。