$SHELL最後に使用

$SHELL最後に使用

私はただスクリプトを書きたいだけですディレクトリを変更する

以下のコマンドをファイルに入れました/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

関連情報