我正在重寫我自己的 ls 實作,我發現它在我的 Macbook 和我的 Xubuntu 虛擬機上的作業方式不同。
我正在測驗的行為是在目錄名稱之后使用標志,例如(Desktop 和 ft_ls 都是目錄):
/bin/ls -a Desktop -r ft_ls
在我的 Mac 上產生這個輸出
ls: -r: No such file or directory
Desktop:
. .. .DS_Store .localized
ft_ls:
. .. .git Makefile ft_ls ft_ls.a includes libft main.c srcs test
如您所見, -r 被視為檔案或目錄,但是在我的虛擬機上,使用大致相同的命令 -r 被視為選項(Bureau 和 ft_ls 都是目錄):
/bin/ls -a Bureau -r ft_ls
在 Xubuntu 上生成此輸出
ft_ls:
srcs Makefile main.c libft .git .dist .. .
Bureau/:
terminator.desktop libft .. .
您可以在自己的系統上重現此行為:
/bin/ls -a "Any directory" -r "Any directory"
我做錯了什么還是 ls 在 Linux 和 Macos 之間有所不同?謝謝您的回答 !
uj5u.com熱心網友回復:
GNU C 庫版本getopt()認為您應該被允許交錯選項和引數,因此將 解釋-r為一個選項,排列引數陣列以-r在實際檔案引數之前移動。
的 POSIX 規范getopt()沒有指定這種行為,并且許多非 GNU 實作getopt()沒有置換引數串列。Mac(可能還有 BSD 系統)不會自動使用 GNU getopt()- AFAIK,您必須先安裝它并鏈接到該庫,然后才能鏈接到系統庫。
在 GNU 系統上,您可以設定環境變數POSIXLY_CORRECT來抑制選項的排列——我通常在我的作業機器上使用這個設定運行,并且必須為幾個依賴于POSIXLY_CORRECT未設定的作業提供的腳本設定封面腳本——封面scripts 取消設定變數,然后運行官方腳本。
請注意,--作為選項使用意味著它后面的任何內容都不是選項;選項后面的引數--將被視為非選項引數getopt()。
對于可移植的作業,請確保將選項放在其他引數之前。如果您正在運行多個運行其他命令的命令,請--隨意使用。
我經常使用的一個命令序列是:
repeat -n 25 -i 300 -d 120 -c -- timecmd -m -- cvl
該repeat命令在第一個雙破折號 ( --) 之后重復該命令 25 次,初始延遲為 300 秒,之后延遲 120 秒,并在識別資訊中列印出重復計數。timecmd -m秒后命令所花費的--時間,以毫秒為單位報告。該cvl命令查看當前構建日志,報告構建進度并分析日志檔案中的錯誤。至關重要的是,該-m選項不被解釋repeat(因為它不是 的有效選項repeat)。--確保被-m賦予timecmd而不被 包含repeat。定時cvl命令告訴我是否有由于網路或其他問題引起的延遲。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/529450.html
