Linux マシンのフォルダに cd できません。ファイル/フォルダが存在しないと表示されます。

Linux マシンのフォルダに cd できません。ファイル/フォルダが存在しないと表示されます。

フォルダーに cd してリスト表示するテスト ksh ファイルを作成しました。次のように書かれています:

`cd "their_file/"`;

`pwd`;

`ls -l`;

次のような出力が得られます:

./test.ksh: line 2: /home/user/final: Is a directory

./test.ksh: line 3: total: command not found

これは私のパスワードです:

/home/ユーザー/最終

これを修正するにはどうすればいいでしょうか? cd ステートメントを実行してからステートメントを終了するのだと思います。私は Fedora マシンを使用しています。

答え1

スクリプト内の各コマンドをバックティックで囲むと、シェルはコマンドの出力を取得して実行します。それコマンドとして。

コマンドの前後にバックティックを使用することは、コマンドを内部に配置することと同じです$( ... )(これは、コマンドの出力をキャプチャするための推奨構文です)。

エラー メッセージは、 の結果をコマンドとして実行しようとした/home/user/final: Is a directoryことから発生し、同様に、の結果を実行しようとしたことからも発生します。kshpwdtotal: command not foundls -l

バックティックを削除します。セミコロン ( ;) も削除します。これらは、同じ行に 2 つのコマンドを配置する場合にのみ必要です。

cd dir; pwd

スクリプトは次のようになります

#!/bin/sh

cd "their_file"
pwd
ls -l

が失敗した場合でも、これは実行されることに注意してください。が失敗した場合にスクリプトを終了するにはpwd、次の手順を実行します。ls -lcdcd

#!/bin/sh

cd "their_file" || exit 1
pwd
ls -l

cdこれは、非ゼロを返すという事実を利用している。終了ステータス失敗した場合、||(論理または) は、が「false」を返す場合(シェル スクリプトでは、終了ステータスがゼロ以外の場合)、exit 1スクリプトがステートメントの実行を続行することを意味します。exitcd


あなたが得る理由/home/user/final: Is a directoryない /home/user/final/their_file: Is a directorycdサブシェル(バックティック内または 内に配置した場合に発生します$( ... ))。サブシェルで実行されるため、作業ディレクトリの実際の変更は親シェル (スクリプト) に反映されません。

同じ理由で、スクリプトの実行が終了したときに、スクリプトを呼び出した時点と同じディレクトリにいて、ディレクトリ内にいないことに気づくでしょうtheir_file

この件の詳細については、「スクリプトの cd 関数が動作しない理由" そして "現在のディレクトリを変更するスクリプト (cd、pwd)」(およびその他の同様の質問)。

関連情報