2012-09-10 63 views
0

我想更改命令,以便命令行標誌(選項)放在命令行參數之前,這是由GNU getopt自動完成的。Bash:是否可以在執行前更改命令

Mac使用BSD getopt以使功能缺失。我想調整bash,以便在執行一個命令時,我運行腳本來解析標誌和參數,對它們重新排序並執行重新排序的命令。

這樣,既

ls -lh /tmp 
ls /tmp -lh 

會在我的Mac的終端工作。

+0

什麼樣的訂單改變你假設3個或更多的選項'cp -R/root/bkp'例如 – triclosan

+1

假設我現在關於它,你知道你可以通過coreutils macport http://www.macports.org/ports.php?by=name&substr=coreutils(也可能是其他人)在Mac上獲得很多GNU工具嗎?也許這可以幫助你做出努力。 – Mat

+0

@Mat,我認爲替換它們是很乏味和危險的。此外,它不會與依賴於BSD getopt的其他可執行文件一起工作。我正在考慮構建一個執行重新排序的shell,然後調用bash。 – luanjunyi

回答

2

除非您知道getopt()函數的optstring參數對於每個命令的外觀,否則無法安全地編寫通用工具來執行重新排序命令行參數的工作。試想一下:

make something -f makefile 
cp something -f makefile 

在第一個命令,你必須同時-fmakefile移動到前面規範化的命令調用。第二,你只能移動-f;如果您也移動了以下文件名,則可以重寫該命令並銷燬您的數據。

當然,如果該命令也採用長格式--force--file=makefile樣式參數,您還必須知道getopt_long()參數字符串的外觀。

坦率地說,你最好在你的Linux環境中使用POSIXLY_CORRECT,忘記它提供的靈活的靈活性,並學習在任何時候在你的論點之前寫下你的選項。如果你這樣做的話,你的代碼可以在所有類Unix機器上更好地工作。


你可以比/bin/usr/bin(如/usr/gnu/bin一些其他目錄下安裝GNU軟件,然後確保你把/usr/gnu/bin PATH中領先於系統目錄中。還有像fink預建的系統了。然而,這對於那些沒有GNU類似物的工具沒有任何幫助,而且你寫的shell腳本不能移植到其他與你沒有相同設置的Mac上。

相關問題