
我已經編寫了一個測試 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
腳本中每個命令周圍的反引號將導致 shell 取得命令的輸出並執行那作為命令。
在命令周圍使用反引號相當於將命令放入其中$( ... )
(這是捕獲命令輸出的首選語法)。
錯誤訊息/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
,腳本將繼續執行該語句(這在 shell 腳本中是非零退出狀態的意思)。exit
cd
你得到的原因/home/user/final: Is a directory
和不是 /home/user/final/their_file: Is a directory
是因為是cd
在 a 中執行的子殼(這就是當您將其放在反引號或內時發生的情況$( ... )
)。由於它是在子 shell 中執行的,因此工作目錄的實際變更不會反映在父 shell(您的腳本)中。
出於同樣的原因,您會注意到,當腳本執行完畢後,您仍將位於與呼叫腳本時相同的目錄中,而不是在目錄中their_file
。
有關此特定事物的更多信息,請參閱“為什麼腳本中的 cd 功能不起作用“ 和 ”更改目前目錄的腳本(cd、pwd)「(以及其他類似的問題)。