為什麼 2 台 Linux 機器使用相同語法的指令會有不同的行為?

為什麼 2 台 Linux 機器使用相同語法的指令會有不同的行為?

我用的是2台機器,都是紅帽企業 Linux AS 第 3 版(Taroon 更新 2) (我在 /etc/*-release 中檢查它)。

我檢查過他們使用的是相同的預設 shell ps -p $$,即 bash。

我嘗試使用通配符模式執行查找命令: find path -name pattern -type f -ctime +3

且模式包含 * 字元作為萬用字元。

第一台機器似乎擴展了通配符並導致錯誤:

find /home/primbat/testing -name sftp_bcs_report_*.log -type f -ctime +7
find: paths must precede expression

我需要在兩個分隔的 qoute 之間建立模式,例如:\"sftp_bcs_report_*.log\"set -f在腳本中使用來抑制通配符擴充。

而在其他機器上則沒有這樣的問題。你有什麼主意嗎?

答案1

預設情況下,如果檔案與 shell 匹配,shell 就會展開通配符,但如果沒有匹配則保持不展開。例如,如果您執行touch /tmp/111; touch /tmp/11*此命令,將在 /tmp/111 上建立並更新 mtime,但如果 /tmp 為空但您調用,touch /tmp/11*您將在 /tmp 中獲得名為“11*”的檔案。

這是貝殼相當奇怪的功能。有時,如果沒有特殊的駭客作為中間函數,正確的擴展是不可能的。大多數目前的 shell 都為典型情況發明了特殊選項;例如,bash 中的「shopt -s failureglob」會拒絕執行任何通配符符合失敗的命令。

需要依賴find的通配符擴展,因此在shell中應該引用這樣的模式來防止擴展:

find /home/primbat/testing -name 'sftp_bcs_report_*.log' -type f -ctime +7

(注意單引號)。對於零個或一個文件,它可以工作,但是對於兩個或多個文件,你會得到損壞的命令語法,並且它會抱怨 - 這是同事所說的阿爾切格。你的“set -f”完全禁用擴展 - 嗯,這是很好的診斷措施,但可以為未來的移動提供水下耙子。引用更簡單:)

答案2

聽起來第二台機器上的起始目錄中沒有符合的文件sftp_bcs_report_*.log,而第一台伺服器上有多個這樣的文件。對於使用find,模式應始終被引用。

相關內容