2012-12-14 68 views
0

我在linux下的.bashrc防止終端從當自定義bash函數運行結束

open() 
{ 
    echo enter file name 
    read fname 
    locate $fname> /home/vvajendla/Desktop/backup/loc; 
    cat loc 
    exec < /home/vvajendla/Desktop/backup/loc; 
    value=0 
    while read line 
    do 
    value=`expr $value + 1`; 
    echo $value 
    echo $line 
    if [ $value -le 6 ] 
    then 
     gedit $line; 
    else 
     echo too many files to open 
    fi 
    done 

}寫了下面的程序

上述功能搜索所有目錄的文件字符串匹配和如果它們小於或等於6,則使用GEDIT打開它們。

無論何時我在終端中運行此函數,它都會關閉。 你能告訴我我能做些什麼來保持它的開放嗎?

回答

3

exec會導致調用shell的標準輸入從文件中永久重定向。一旦文件關閉,shell將用盡輸入,然後退出。我假設你用source導入了這個函數;獨立運行應該可以工作。

通常寫這種函數的方法是讓它接受一個參數,所以你可以像「open fnord」那樣調用它,而不是運行「open」並在提示符下輸入「fnord」。

open() { 
    local fname 
    fname=$1   # notice this arrangement instead of read 
    local value 
    value=0 

    locate "$fname" | # notice double quotes 
    tee /dev/stderr | # as a superior alternative to using a temporary file 
    while read line 
    do 
    value=`expr $value + 1` 
    if [ $value -le 6 ] 
    then 
     gedit "$line" # notice double quotes 
    else 
     echo too many files to open >&2 # notice redirection to stderr 
    fi 
    done 

} 

該診斷具有誤導性;此代碼仍然會打開前六個文件,然後在第七個位置保存錯誤消息。那是你的意圖嗎?還是應該計算輸出的數量,如果超過六個,拒絕運行?

如果您不關心其他改進,則最小修複方法是從您的臨時文件中刪除exec並讀取while循環的輸入。 (你應該小心收拾妥當;如果你能避免一個臨時文件,這基本上總是一個更好的解決方案)

while read line; do 
    .... 
done <tempfile 

我會受到誘惑與nl中添加行號,以擺脫吸引力expr的,但是這可能會在開頭處以空格分隔文件名稱。 (?在另一方面,locate總是產生一個全路徑名,右)

作爲替代,並假設gedit可以讀取多個文件名參數,試試這個:

locate "$fname" | head -n 6 | xargs gedit 

這不能產生警告如果有超過六個文件,但我實際上認爲這是一個功能。

+0

非常感謝你... – Caleb554

+0

不客氣。如果有幫助,請考慮接受此答案。 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – tripleee