2016-10-10 70 views
0

我想在bash中創建一個別名,如果我輸入'logs',它應該帶我到最新的日誌文件。我的文件夾結構是〜/ logs/date/time。谷歌搜索了一段時間後,我發現了下面的命令,並將其工作正常,如果我在bash中給出提示在bash中的.aliases文件中逐個執行命令

cd ~/logs && cd `ls -tr | tail -1` && cd `ls -tr | tail -1` 

但如果我添加它.aliases並將其映射到「日誌」,那麼預期它不工作。它的CD到日誌,然後嘗試進入最新的文件/文件夾,我執行命令。 (例如)如果我處於FOLDER1並執行「日誌」,它會將 光盤放入日誌中,然後嘗試將光盤放入FOLDER1中的最新文件夾。

編輯:我的別名定義

alias logs="cd ~/logs && cd `ls -tr | tail -1` && cd `ls -tr | tail -1`" 

任何想法,爲什麼它的行爲就像這個&我怎樣才能使這項工作?

+0

另外:'ls -t'是** not **找到最新/最舊的可用文件的安全方法。請參閱[ParsingLs](http://mywiki.wooledge.org/ParsingLs)和[BashFAQ#3](http://mywiki.wooledge.org/BashFAQ/003)。 –

+0

...如果日誌目錄中的選定文件名稱中包含空格,則此代碼工作得非常糟糕,少得多的奇特字符(如換行符)。 –

+0

順便說一句,如果你顯示*你的別名定義本身*,這將是有益的。從問題中可以明顯看出,您使用雙引號而不是單引號,但如果顯示它,我們不必推斷它。 –

回答

1

問題在於定義別名時一次評估反引號的命令。 (在這裏你不能使用ENV變量。)

alias logs="cd ~/logs && cd \`ls -tr | tail -1\` && cd \`ls -tr | tail -1\`" 

或者單引號表達查爾斯評論說:

要麼逃避他們

alias logs='cd ~/logs && cd "`ls -tr | tail -1`" && cd "`ls -tr | tail -1`"' 

或者創建一個功能,那也有用,是更具可讀性,因此您可以像查爾斯(再次!)建議的那樣更容易地添加健壯性(當創建別名時,您只需執行一個快速操作):

logs() 
{ 
    cd ~/logs || return 
    cd "`ls -tr | tail -1`" || return 
    cd "`ls -tr | tail -1`" || return 
} 
+0

另外,考慮把'||在所有'cd'上返回'',這樣我們就不會嘗試進入當前目錄的子目錄,如果'cd〜/ logs'出於某種原因失敗了。 –

+0

@CharlesDuffy:原因:當你開始使用ksh時,舊習慣會很難消退。編輯您的意見。 –

+0

(增加更多引號也會減少由於ls -tr | tail -1的不足而導致失敗的地方的數量)。 –

相關問題