1

重複の可能性:
bash シェル スクリプトで「cd」が機能しないのはなぜですか?

バッククォートまたは $(..) の cd コマンドが新しいディレクトリに変更されないのはなぜですか。単一のコマンドでそれを行う方法、つまりエラーをキャプチャしてディレクトリを変更する方法。

[root@linux ~]# pwd
/root
[root@linux ~]# cmdMsg=`cd /tmp 2>&1`
[root@linux ~]# pwd
/root
4

4 に答える 4

3

バックティックは別のプロセスを生成し、別々に実行するためです。そのため、そのプロセスで cd を実行しますが、現在のプロセスの作業ディレクトリは変更しません。

コマンドが成功したかどうかを確認する必要があり、ディレクトリを変更したい場合は、終了コードを確認できます。

cd /tmp
retval = $?

if [ $retval -gt 0 ]; then
    echo "cd failed"
fi
于 2012-10-23T15:28:21.913 に答える
0

子プロセスは、親プロセスの環境を変更できません。

pwd
`cd /tmp 2>&1`
pwd
  1. 現在のプロセスの作業ディレクトリを出力します。
  2. 新しい子プロセスを作成します。
  3. 子プロセス内のディレクトリ /tmp に変更します (stderr を stdout にリダイレクトしている間)。
  4. 子プロセスを終了します。
  5. 現在のプロセスの作業ディレクトリを出力します。
于 2012-10-23T15:35:08.857 に答える
0

これは、cd を実行するために開いた新しいシェルのコンテキスト内にあるため、たとえば次のように試してください。

cmdMsg=`cd /tmp; pwd`
echo $cmdMsg

/tmp にいたことが表示されます

于 2012-10-23T15:28:27.393 に答える
0

;1 つのコマンドですべてを実行する場合は、コマンドを で区切ります。

例えば:

cd /; ls; cd ~; ls; cd /var; ls

しかし、あなたの場合の問題は、 cd が新しく生成されたシェルで実行されることです。これは現在のシェルには影響しません。

于 2012-10-23T15:29:35.893 に答える