テスト用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
私のパスワードは次のとおりです。
/ホーム/ユーザー/最終
どうすれば解決できますか?私はそれがcdステートメントを実行し、そのステートメントを終了していると思います。私はFedoraコンピュータを使用しています。
答え1
スクリプトの各コマンドの周りにバックティックがある場合、シェルはコマンドの出力を取得して実行します。それコマンドで。
コマンドの周りにバックティックを使用することは、その中にコマンドを置くのと同じです$( ... )
(これはコマンド出力キャプチャに好ましい構文です)。
エラーメッセージは、コマンドで実行しようとしたときに/home/user/final: Is a directory
発生し、同様に実行しようとしたときに発生します。ksh
pwd
total: command not found
ls -l
バックティックを取り除きます。セミコロン( ;
)も削除します。両方のコマンドを同じ行に入れたい場合にのみ必要です。
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)"(および他の同様の問題).