Bash

什麼是像 {} 這樣的 replstrs?

  • October 23, 2016

在文件中xargs提到了-I標誌採用的“replstr”。當我發現這個命令執行時,我開始閱讀它fswatch

fswatch -0 -e ".*" -i ".rb" . | xargs -0 -n 1 -I {} ruby {}

並開始閱讀手冊頁xargs

-I replstr
       Execute utility for each input line, replacing one or more occurrences of replstr in up to replacements (or 5 if no -R flag is
       specified) arguments to utility with the entire line of input.  The resulting arguments, after replacement is done, will not be
       allowed to grow beyond 255 bytes; this is implemented by concatenating as much of the argument containing replstr as possible, to
       the constructed arguments to utility, up to 255 bytes.  The 255 byte limit does not apply to arguments to utility which do not
       contain replstr, and furthermore, no replacement will be done on utility itself.  Implies -x. 

考慮術語“replstr”似乎可能意味著“讀取評估列印循環字元串”,這是它的縮寫嗎?我開始玩弄它,試圖了解{}正在做什麼,但我不確定我是否真的明白了:

➜  scripts git:(master) ✗  {0..3}
zsh: command not found: 0..3
➜  scripts git:(master) ✗ echo {0..3}
0 1 2 3
➜  scripts git:(master) ✗ echo {a..3}
a ` _ ^ ] \ [ Z Y X W V U T S R Q P O N M L K J I H G F E D C B A @ ? > = < ; : 9 8 7 6 5 4 3
➜  scripts git:(master) ✗ echo {a..d}
a b c d
➜  scripts git:(master) ✗ echo cats and dogs | xargs
cats and dogs
➜  scripts git:(master) ✗ echo cats and dogs | xargs {}
xargs: {}: No such file or directory
➜  scripts git:(master) ✗ echo cats and dogs | xargs {} echo {}
xargs: {}: No such file or directory
➜  scripts git:(master) ✗ echo cats and dogs | xargs -I {}

➜  scripts git:(master) ✗ echo cats and dogs | xargs -I {} echo {}
cats and dogs

例如echo {a..3},對我來說真的沒有意義。看起來它確實在做一些“在這裡替換這個字元串列表”的效果,但我不確定這是否是正確的看待它的方式。此外,我不確定是否{}是特定類型的 replstr 以及是否有更多,或者 replstr 是否只是一對花括號之間的任何內容。希望獲得有關 replstr 以及如何處理它們的一些指導。

-I參數的工作方式如下:-I whatever意味著出現的字面意思whatever被命令參數替換。展示:

$ echo "a
b
c" | xargs -I f echo hey f hey f
hey a hey a
hey b hey b
hey c hey c

看?xargs取每一行a,bc, 並用它們代替fin echo hey f hey f

沒有{}涉及。

-I選項是 POSIX 。GNUxargs記錄了一個不推薦使用的-i選項,如果呼叫它的-iwhatever行為類似於-I whatever. 如果被呼叫,-i它的行為就像-I {}. 在這種情況下,{}將替換出現的 。{}顯然是受到find: 它的-exec謂詞的一個特徵的啟發。

由其“大括號擴展”處理的{a..b}and Bash 語法。沒有特殊含義,並按原樣傳遞給命令。(如果不是,它將破壞符合標準的、常見的呼叫。)foo{a,b,c}bar``{}``find

replstr表示“替換字元串”或“替換字元串”。

原來的 replstr 是{}. 它最初是用find命令exec子句引入的,它被找到的每個文件名替換,例如

find /tmp -name "foo*" -exec echo file {} found \;

將顯示,假設兩個文件匹配模式:

file foo1 found
file foo2 found 

xargs命令允許對從傳遞給其標準輸入的字元串建構的參數執行相同的操作,並且還允許指定{}與替換字元串不同的內容。

請注意,預設的 replstr 只是{}在大括號內沒有任何內容,後者用於不同的目的,例如您已經註意到的範圍或參數擴展。

引用自:https://unix.stackexchange.com/questions/318250