Bash

試圖創建打開最後修改文件的別名

  • August 17, 2016

我經常做的一件事是編輯最近修改的文件,所以我想我會在 ~/.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>'.

引用自:https://unix.stackexchange.com/questions/166837