pipe(管線) 與 xargs 的用法

小弟我最近寫了一個 shell script , 內容是從某一個檔案抓取最後一行的第一個字串當作參數好讓另一個 shell script 執行

tail -1 filename > awk '{print}' | AE

發現這樣子 "AE" 沒辦法執行

問了其他人,他們的回答是要用 xargs 才可以,亦即

tail -1 filename > awk '{print}' | xargs AE

pipe 用意不是說把標準輸出當作另一個 command 的標準出入嗎?

可是不加 xargs 卻不會 work , 為什麼呢?

AE 內容:

if [ "$#" -ne 1 ]

then

echo "Usage : AE WaferID"

exit

fi

grep "Ave energy (uj,%)" /customer/G714/pmon/o.$1 > $1-energy.txt

ave $1-energy.txt

rm $1-energy.txt

Update:

感謝 Jason 大大提供的另一個處理方式,但是還是沒有辦法解決我所問的問題

為何要加 xargs 這個參數

1 Answer

Rating
  • 可魯
    Lv 5
    1 decade ago
    Favorite Answer

    AE `tail -1 filename | awk '{print}' `

    說明:

    tail -1 filename | awk '{print}' 這樣可以產生您要的參數. 而這個參數要傳給AE, 但是又要必AE 先執行,Unix 的shell 有一個反單引號, 可以先執行反單內的指令, 並把輸出放在該位置.

    例如:

    # echo I am at `tty`

    其中的 `tty` 就是先執行

    # echo Today is `date`

    2008-11-28 09:43:04 補充:

    tail -1 filename > awk '{print}' | xargs AE

    改成這樣

    tail -1 filename | awk '{print}' | xargs AE

    原來您寫的會在目前目錄下產生檔案 awk {print}, 而不是丟給 awk 去執行,

    執行是要用 "|", ">" 是產生輸出轉向到檔案.

    xargs 是為了讀入 standard input, 並且把它當成指令的參數. 但是重點是xargs它要

    讀入 standard input, 但是被tail -1 filename > awk '{print}' 轉向轉成檔案, 已經沒有

    東西讓 xargs 讀了.

Still have questions? Get your answers by asking now.