web-dev-qa-db-ja.com

エイリアス、関数、ソースのないbashスクリプトのcd

ディレクトリにcdする必要のあるbashスクリプトを作成しました。

私の問題は、サブシェル内のディレクトリのみが変更されることです。

私はこれに似た多くの問題を読みましたが、解決策があるかどうかを知りたいです以外にエイリアス、関数を使用するか、スクリプトを調達します。

私の意味がわからない場合は、次の例をご覧ください。

user@linux ~: cat ./myscript.sh
#!/bin/bash
cd /any/directory
user@linux ~: ./myscript.sh
user@linux ~: 

私のスクリプトはmuch長いので、関数を使いたくないことに注意してください!

Cdコマンドを現在のシェルで有効にする場合は、子シェルでの変更が親シェルに伝播されないため、現在のシェルでスクリプトを実行する必要があります。

      $ pwd
      /afs/user/i/ahmad
      $ cat test1
        #!/bin/bash
        cd /etc
      $ . test1           #runs test1 in current Shell even if its not executable
      $ pwd
      /etc

echoとevalを使用:

親シェルでevalを使用する。親シェルで実行するシェルスクリプトエコーコマンドでは、次のようにします。

echo "cd $filepath"

親シェルでは、evalを使用してシェルスクリプトをキックできます。

  eval `sh foo.sh`

例:

  $ cat test1.sh 
   #!/bin/bash
   echo "cd /etc"

  $ eval `sh test1.sh`
  $ pwd
  /etc
1
Ijaz Ahmad Khan

スクリプトを実行すると、独自のパラメーターや関数などを使用して個別のプロセスが開始されます。このプロセスは親シェルから環境を継承しますが、その後は別個の生命体になります。 cd-サブシェルの親シェルのどこかで、別のプロセス内から1つのプロセスで他のコマンドを送信するのと同じ方法で実行することはできません。言い換えれば、のような魔法はありません

command "run in process 123456"

これで、実行するコマンドをプロセスに送信することはできませんが、実際にはkillコマンドを使用してsignalをプロセスに送信できます。したがって、この状況に備えて親シェルを以前に準備した場合は、そのシグナルをtrapして、コマンドを実行できます。

最小限の例を次に示します。

/home/jimmij $ trap 'cd /tmp' INT
/home/jimmij $ cat myscript.sh
#!/bin/bash
echo Changing parent directory
kill -s SIGINT $PPID

/home/jimmij $ ./myscript.sh
Changing parent directory

/tmp $
0
jimmij