
私はただスクリプトを書きたいだけですディレクトリを変更する。
以下のコマンドをファイルに入れました/home/alex/pathABC
#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld
やった
chmod +x pathABC
ターミナルで、 にいるときに/home/alex
を実行しました./pathABC
が、出力は だけでHelloWorld
、現在のディレクトリは変更されません。
それで何が問題なのですか?
答え1
他の人が説明しているように、ディレクトリはスクリプトの子プロセスで変更されます。スクリプトが呼び出されるターミナル プロセスでは変更されません。子プロセスが終了すると、元の場所に残っているターミナルに戻ります。
いくつかの代替案:
1. シンボリックリンク
簡単にアクセスしたい長いパスへのシンボリックリンクをホームに配置します
$ ln -s /home/alex/Documents/A/B/C ~/pathABC
次に、次のコマンドでディレクトリにアクセスします。
$ cd ~/pathABC
2. 別名
~/.bashrc にエイリアスを追加します:
alias pathABC="cd /home/alex/Documents/A/B/C"
(からここ)
3. 機能
ディレクトリを変更する関数を作成します。関数はターミナルのプロセス内で実行され、ディレクトリを変更できます。
(からここ)
4. 子どもが走るのは避ける
スクリプトを実行するのではなく、ソース化します。ソース化 (または によって実行.
)source
により、スクリプトは独自のサブシェルで実行されるのではなく、同じシェルで実行されます。
$ . ./pathABC
5. cd 可能な変数
cdable_vars
オプションを設定し~/.bashrc
、ディレクトリに環境変数を作成します。
shopt -s cdable_vars
export pathABC="/home/alex/Documents/A/B/C"
次に、cd pathABC
(からここ)
答え2
ターミナルでスクリプトを実行すると、子プロセスが実行されます。この子プログラムでは、スクリプトは指定されたディレクトリに変更されます。ただし、親プロセスでは、スクリプトを実行する場所は古いパスのままです。または、単純に次のように言うこともできます。
cd コマンドのスコープは親プロセスではなく子プロセスのみに適用されます。
答え3
あなたは思考の誤りを犯しています。現在のシェル同じディレクトリに留まると、脚本新しいディレクトリに移動しました。
別のスクリプトを作成することで、新しいディレクトリを変更した後、スクリプトから実行します。
#!/bin/sh
cd /home/alex/Documents/A/B/C && ./another_script.sh # (if it is executable)
2 番目のスクリプトは新しいディレクトリから実行されます。
HelloWorld
スクリプトの出力のみです。
答え4
$SHELL
最後に使用
bash スクリプトは、現在の環境またはその子の環境で動作しますが、親環境では動作しません。
しかし、この質問はよく聞かれる。実行後に特定のディレクトリのコマンドプロンプトに残される別のディレクトリ内のスクリプト。
もしそうなら、単純に子$SHELL
インスタンスを実行するスクリプトの最後に:
# !/usr/bin/env bash
cd /home/alex/Documents/A/B/C
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
$SHELL
前の親シェルインスタンスに戻るには、Ctrl+ を使用しますD。