回答:
これは予想される動作であり、すでに何度か議論されています。
スクリプトはサブシェルで実行され、親シェルの作業ディレクトリを変更できません。終了すると、その効果は失われます。
ディレクトリを永続的に変更するには、次のようにスクリプトをソースする必要があります
. ./script
source ./script
同じ?
.
およびsource
bashが等しい。2. ./
同じディレクトリにある場合、ファイル名の前に使用する必要はありません。:これだけで実行しても大丈夫です. script
このような小さなタスクの場合、スクリプトを作成する代わりに、このようなエイリアスを作成し、
$ alias cdproj='cd /dir/web/www/proj'
.bashrc
すべての対話型シェルに設定する場合は、これをファイルに追加する必要があります。
これで、これをとして実行できます$ cdproj
。
eval `./script`
またはeval $(./script)
を使用してそれらのコマンドを実行することもできます。これは、呼び出しシェルの環境を更新する必要があるコマンドの一般的なアプローチです。
eval
アプローチを行う場合は、出力する内容に注意してください。
exec bash
最後に使用bashスクリプトは、現在の環境またはその子で動作しますが、親環境では動作しません。
ただし、別のディレクトリからbashスクリプトを実行した後、特定のディレクトリのbashプロンプトのままにしておきたいため、この質問がよく聞かれます。
この場合、スクリプトの最後で子bashインスタンスを実行するだけです:
#!/usr/bin/env bash
cd desired/directory
exec bash
これにより、新しいサブシェルが作成されます。入力exit
して、スクリプトが最初に開始された最初のシェルに戻ります。
exec
一般的に悪党の最後の手段と考えられます。.. :)
exit
(またはCtrl + D)によってセッションを正常に終了しようとすると、11〜21 回実行する必要があります。(2)実行可能スクリプトを使用する別の欠点は、インタラクティブシェルセッションでシェルオプション( dotglob
または globstar
)を設定すると、新しいシェルを開始するため、それらが失われることです。
「exec」を使用して、私が望んでいることを正確に実行するのはなぜですか。
#!/bin/bash
cd someplace
exec bash
~/someplace
exit
(またはCtrl + D)によってセッションを正常に終了しようとすると、11〜21 回実行する必要があります。
dotglob
またはなど globstar
)を設定すると、新しいシェルを開始するためにそれらが失われることです。…(続き)
関数または&&を使用してそれを行うことができます。以下の例では、Zabbixをインストールし、その中に1行のファイルを作成します。
例:
#!/bin/bash
# Create Function:
installZabbix(){
cd /usr/src/zabbix-4.2.4;
./configure --enable-agent;
make install;
cd /usr/src/;
>file;
echo "Hi, this is a file." >>file;
}
# Call the function:
installZabbix
または:
#!/bin/bash
cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file
return
この方法でソースされたスクリプトからエスケープするために使用する必要があることに注意してくださいexit
-これらはシェル関数のようでありexit
、スクリプトをソースしたシェルを終了します。