
フォルダーに 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
ことから発生し、同様に、の結果を実行しようとしたことからも発生します。ksh
pwd
total: command not found
ls -l
バックティックを削除します。セミコロン ( ;
) も削除します。これらは、同じ行に 2 つのコマンドを配置する場合にのみ必要です。
cd dir; pwd
スクリプトは次のようになります
#!/bin/sh
cd "their_file"
pwd
ls -l
が失敗した場合でも、これは実行されることに注意してください。が失敗した場合にスクリプトを終了するにはpwd
、次の手順を実行します。ls -l
cd
cd
#!/bin/sh
cd "their_file" || exit 1
pwd
ls -l
cd
これは、非ゼロを返すという事実を利用している。終了ステータス失敗した場合、||
(論理または) は、が「false」を返す場合(シェル スクリプトでは、終了ステータスがゼロ以外の場合)、exit 1
スクリプトがステートメントの実行を続行することを意味します。exit
cd
あなたが得る理由/home/user/final: Is a directory
とない /home/user/final/their_file: Is a directory
はcd
、サブシェル(バックティック内または 内に配置した場合に発生します$( ... )
)。サブシェルで実行されるため、作業ディレクトリの実際の変更は親シェル (スクリプト) に反映されません。
同じ理由で、スクリプトの実行が終了したときに、スクリプトを呼び出した時点と同じディレクトリにいて、ディレクトリ内にいないことに気づくでしょうtheir_file
。
この件の詳細については、「スクリプトの cd 関数が動作しない理由" そして "現在のディレクトリを変更するスクリプト (cd、pwd)」(およびその他の同様の質問)。