懒惰的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
答案 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
。