2016-07-29 61 views
0

我有兩件事,一個是一個函數,另一個是別名,他們不太正常工作。試圖獲得兩個bash函數與管道和可選的參數工作

第一個是拖尾日誌,但只顯示前3行,方法是找到要查找的日誌的重要部分,然後顯示接下來的兩行或您指定的很多行。

# tail -f $1 | grep $2 -A 2 
function tinput() { 
    if [ "$3" != "" ] 
    then 
     $(tail -f $1 | grep $2 -A $3) 
    else 
     $(tail -f $1 | grep $2 -A 2) 
    fi 
} 

可以說,我用這樣的:

tinput /var/log/webapps/app.name.com.error.log,#<.*Error: 

它象這樣的錯誤:

zsh: no such file or directory: .*Error: 

我不知道,但也許這不是正確或監守我看到ARGS在做管道?

二是:

function loadmysqldump() { 
    $(pv $1 | mysql -u root $1) 
} 

它是使MySQL數據庫轉儲恢復狀態一點更明顯(爲什麼程序不使用財產以後證明它的工作,我不知道,即使是微調會不錯)但不像做-v那樣討厭。

好的,所以我承認做了一個booboo,出於某種原因,我忘記了在終端的參數是由空格分隔的,而不是撇號,所以它工作;坦率地說,我只使用grep因爲我無法得到我真正想要的,從tail -f每個單獨的輸出的前n行,沒有其他我試過。

+0

不知道zsh的,但在bash,你不能使用別名..使用函數變量,而不是..見:https://unix.stackexchange.com/questions/30925/in-bash-何時寫腳本以及何時寫腳本功能/ 30964#30964 – Sundeep

+0

好,夠公平的。 – Thermatix

+1

您正在執行管道命令行的輸出'tail -f $ 1 | grep $ 2 -A 2'。爲什麼使用'$(...)'? – Jdamian

回答

2

你不能(或不應該)這樣稱呼它:

tinput /var/log/webapps/app.name.com.error.log,#<.*Error: 

原因與如何處理zsh不匹配任何模式做。未加引號的*的存在使得整個第一個參數成爲zsh試圖與現有文件匹配的模式。當它不匹配任何東西時,會引發錯誤。您可以通過取消設置NOMATCH選項來更改此行爲,這將使zsh像其他shell一樣工作,並按字面處理該模式。更好的解決辦法是要明確和引述的說法:上述

tinput "/var/log/webapps/app.name.com.error.log,#<.*Error:" 

在沒有的情況下,你需要命令替換。

function loadmysqldump() { 
    pv $1 | mysql -u root $1 
} 

function tinput() { 
    if [ "$3" != "" ] 
    then 
     tail -f $1 | grep $2 -A $3 
    else 
     tail -f $1 | grep $2 -A 2 
    fi 
} 

您可以重構tinput顯著指定2作爲-A選項的默認值,如果$3爲空或取消。

function tinput() { 
    tail -f $1 | grep $2 -A ${3:-2} 
}