尝试创建打开最后修改文件的别名

Nic*_*ick 2 shell bash alias quoting

我经常做的一件事是编辑最近修改过的文件,所以我想我会在 ~/.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`"
Run Code Online (Sandbox Code Playgroud)

问题是,奇怪的是,这些命令不起作用。他们打开了一些不是最后一个的文件,甚至从当前目录中删除了一个文件(我想知道目录中是否存在某种文件缓存更新问题。这发生在我的本地机器和我的集群上)从事于)。

但是,如果我vim `ls -rt | tail -1`直接键入而不使用别名,则每次都可以使用。

jw0*_*013 5

问题是您需要在别名定义中引用反引号。双引号 ( ") 不引用命令替换。您将需要单引号 ( ')。用

alias via='vim `ls -rt | tail -1`'
Run Code Online (Sandbox Code Playgroud)

虽然你实际上想要:

alias via='vim -- "$(ls -t | head -n 1)"'
Run Code Online (Sandbox Code Playgroud)

那是:

  • 使用现代形式的命令替换 ( $(...))。
  • 引用它以禁用 split+glob 运算符(否则,如果文件名包含 IFS 字符或通配符,它​​将无法正常工作(如果它具有换行符,它仍然无法正常工作))。
  • 使用--标记的选项结束vim(否则它不会为开头的文件名工作-+)。
  • 使用ls -t | head而不是ls -rt | tail更快地获得结果。

不使用

alias via="vim `ls -rt | tail -1`"
Run Code Online (Sandbox Code Playgroud)

如果这样做,命令替换会在您定义别名时发生,而不是在您运行它时发生。尝试键入alias via以查看输出实际上alias via='vim `ls -rt | tail -1`'不是alias via='vim <prematurely expanded output>'