BashスクリプトのCDには、エイリアス、関数、ソースコードはありません。

BashスクリプトのCDには、エイリアス、関数、ソースコードはありません。

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

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

同様の質問をたくさん読んだが、解決策があるかどうかを知りたい。とは別にエイリアス、関数を使用するか、スクリプトをインポートします。

何を言っているのかわからない場合は、次の例を見てください。

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

私のスクリプトはたくさんもう機能を使いたくない!

答え1

現在のシェルに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 コマンドで親シェルとして実行するコマンドは次のとおりです。

echo "cd $filepath"

親シェルで eval を使用してシェルスクリプトを起動できます。

  eval `sh foo.sh`

例:

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

  $ eval `sh test1.sh`
  $ pwd
  /etc

答え2

スクリプトを実行すると、独自のパラメータ、関数などを使用して別々のプロセスが開始されます。プロセスは親シェルから環境を継承しますが、異なる存在です。cd他のプロセス内で実行されているプロセス内で他のコマンドを送信できるのと同じ方法で、サブシェル内の親シェルの場所でこれを行うことはできません。つまり、このような魔法はありません

command "run in process 123456"

これで実行するプロセスにコマンドを送信することはできませんが、実際には送信できます。シグナルコマンドを使用してプロセスにkill。したがって、このような状況に備えて親シェルを事前に準備しておくと、シグナルを送信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 $

関連情報