Bash
試圖創建打開最後修改文件的別名
我經常做的一件事是編輯最近修改的文件,所以我想我會在 ~/.bash_profile 文件中創建一些快捷方式,而不是輸入“ls -lr”然後輸入“vim lastfile”:
alias via="vim `ls -rt | tail -1`" alias vib="vim `ls -rt | tail -2 | head -1`" alias vic="vim `ls -rt | tail -3 | head -1`" alias vid="vim `ls -rt | tail -4 | head -1`" alias vie="vim `ls -rt | tail -5 | head -1`"
問題是,奇怪的是,這些命令不起作用。他們打開了一些不是最後一個文件,甚至從目前目錄中刪除了一個文件(我想知道目錄中是否存在某種文件記憶體更新問題。這發生在我的本地機器和集群上從事於)。
但是,如果我
vim
ls -rt | tail -1``直接鍵入而不使用別名,則每次都有效。
問題是您需要在別名定義中引用反引號。雙引號 (
"
) 不引用命令替換。您將需要單引號 ('
)。採用alias via='vim `ls -rt | tail -1`'
儘管您實際上想要:
alias via='vim -- "$(ls -t | head -n 1)"'
那是:
- 使用現代形式的命令替換 (
$(...)
)。- 引用它以禁用 split+glob 運算符(否則,如果文件名包含 IFS 字元或萬用字元,它將無法正常工作(如果它有換行符,它仍然無法正常工作))。
- 用於
--
標記選項的結束vim
(否則,它不適用於以-
or開頭的文件名+
)。- 使用
ls -t | head
而不是ls -rt | tail
更快地得到結果。不使用
alias via="vim `ls -rt | tail -1`"
如果你這樣做,命令替換會在你定義別名時發生,而不是在你執行它時。嘗試鍵入
alias via
以查看輸出實際上不是alias via='vim
ls -rt | tail -1'
,而是alias via='vim <prematurely expanded output>'
.