web-dev-qa-db-ja.com

スクリプトを使用してShellを呼び出す作業ディレクトリを変更するにはどうすればよいですか?

重複の可能性:
スクリプトを使用して現在の作業ディレクトリを変更する

メインシェル/ターミナルの作業ディレクトリを変更するスクリプトをいくつか作成しようとしています。そうすることができません。私は以下を試しました

ファイルp1.sh

#!/bin/bash
cd /home/mtk/work/project1

ファイルcode.sh

#!/bin/bash
cd /home/mtk/templates/resusable/sampleCodes

しかし、上記はそれ自体、つまり現在実行されているものに対してのみ変更されることを認識しています。これはp1.shまたはcode.sh この場合。

Shellを呼び出す親の現在の作業ディレクトリを変更するにはどうすればよいか教えてください。

実行と期待の例:

$ pwd
/home/mtk
$ p1.sh
$ pwd
/home/mtk    ### --> Expected /home/mtk/work/project1

注意

私の使用例は次のとおりです。処理を実行してから、プロンプトを事前定義されたディレクトリに配置します。

編集

なぜうまくいかないのかわかります。そして、aliasはそのような場合の解決策のようです。しかし、私は拡大したいと思います、私の質問:

親シェルの作業ディレクトリを動的に変更するスクリプトを作成する必要があります。スクリプトは次のようになりますmycd.sh。コマンドライン引数はmycd.sh -c/-p1/-p2/またはその他のユーザー定義の引数。

与える-cは、シェルの作業ディレクトリをそれぞれのディレクトリに切り替えます。ファイルmycd.shは次のようになります

.. some processing
# parameter parsing
if [ $param1 -eq "c" ]; then
    # change working dir of parent here
else 
... other conditions

シェルの作業ディレクトリを変更する方法があるはずです。

不明な点がありましたらお知らせください。

1
mtk

これには エイリアス を使用します。例:.

alias p1='cd /home/mtk/work/project1'
alias code='cd /home/mtk/templates/resusable/sampleCodes'

これらの行をシェルの起動スクリプトに配置する必要があります。 ~/.bashrc

別のオプションは、 シェル関数 を使用することです。これはもう少し複雑です。シェル関数にはエイリアスに比べていくつかの利点がありますが、この場合、これらの追加機能は必要ありません。

function p1 { cd /home/mtk/work/project1; }
function code { cd /home/mtk/templates/resusable/sampleCodes; }
8
daniel kullmann

実行中のシェルから呼び出し元のシェルを変更することはできません

他のアプリ(例:dircolors)が呼び出し元のシェルを操作するために従うように見えるこれを行う通常の方法は、スクリプトに(実行するのではなく)cd(またはこれまで)コマンドをエコーさせることです。 )次に、呼び出し元のシェルに呼び出しをevalでラップするように要求します

スクリプトで呼び出し元のシェルを設定する以上のことを行おうとしていて、呼び出し元が実際に何をしているのかを知っていることに依存しているため、これはあなたの場合には機能しない可能性があります。

例えば.

#!/bin/bash
#somescript.sh
echo cd /some/path

次に

eval `./somescript.sh`

また、セキュリティのためにやや眉をひそめています; o)

2
didster