如何编写用空格输出(文件)名称的命令,使它们在反引号中工作?

时间:2013-01-24 10:02:07

标签: bash shell zsh

懒惰的unix / linux命令行用户,我使用了一些小的shell脚本来帮助我避免输入。

例如,我有一个脚本lst,它打印当前目录中最新文件的名称。如果这被称为mytext,我输入emacs `lst`,那么mytext将在emacs中打开

但是,如果最新文件名为my text,则emacs `lst`将失败,因为shell会将此命令解释为emacs my text而不是emacs my\ text

使用emacs "`lst`"中的引号可以解决问题,但使用了两次额外的击键次数

有没有办法修改lst以便命令在没有额外击键的情况下工作?输出反斜杠转义的文件名不起作用。

我使用zsh,但问题(希望解决方案)在bash

中是相同的

2 个答案:

答案 0 :(得分:1)

Never use backticks。您必须始终quote properly。没有捷径。 printf %q是唯一可远程移植的替代品(Zsh的${(q)var}类似),但这些不适合您的问题。正确(唯一)的答案是引用。

编辑:也许你应该坚持使用zsh进行互动。我不是那个shell的专家,但我知道它不会在没有使用特殊扩展的情况下在默认模式下执行分词或通配。

$ zsh -c 'x="foo *"; echo $(printf "<%s> " $x)' # two passes of unquoted expansion
<foo *>
$ zsh -c 'emulate sh; x="foo *"; echo $(printf "<%s> " $x)'
<foo> <bltins> <builtins.mm> <COMPATIBILITY> <data> ...

这对你想要的东西来说是一个巨大的胜利(并且是使zsh完全与其他所有内容不相容的重要事情之一)。没有其他shell可以做到这一点。

答案 1 :(得分:1)

如何键入绑定懒惰函数以便不输入任何内容,只需按 Ctrl + z zle在您的文本中插入文本命令行。

z_lst() {                                                                      
  emulate -L zsh
  setopt extendedglob
  local lastfile
  # you could even implement your whole lst function here instead
  lastfile=$(lst)
  LBUFFER+=" ${lastfile// /\ }" # this should print the spaces like '\ '.
}                                                                               
zle -N z_lst && bindkey "^z" z_lst

.zsh

中的适当位置添加此内容