这个单行脚本的哪一部分特定于zsh?
我编写了一个简单的程序sarcasm,它简单地获取所有参数,将它们连接起来,并使用“aLtErNaTiNg Caps”转换结果字符串。我编写了一个简单的单行 shell 脚本,它可以让我使用 dmenu 输入文本,通过该程序运行该文本,并将结果复制到剪贴板。这是我所拥有的:
echo "dmenu -p 'Text: '" | sh | read var ; [[ -n "$var" ]] && echo -n $var | xargs sarcasm | xclip -selection clipboard
它应该:
- 使用 dmenu 提示我输入文本
- 如果(且仅当)我输入了任何文本,请通过
sarcasm程序运行它并将结果复制到我的剪贴板
当我使用 zsh 运行那个确切的命令时,它工作正常,或者如果我使用 zsh 在脚本中运行它(即 shebang is #!/bin/zsh),但是当我使用 bash 运行它时,它不会将任何内容复制到我的剪贴板。这其中的哪一部分是 zsh-only,什么是 bash 等价物(如果有的话)?
回答
这部分:
echo "dmenu -p 'Text: '" | sh | read var
# ............................^^^^^^^^^^
在 bash 中,管道中的每个命令都在单独的子 shell 中运行。因为该var变量是在子shell 中设置的,所以当子shell 退出时该变量会消失。
要在 bash 中执行该命令,请重定向进程替换的输出:这样,read命令将在当前 shell 中运行。
read -r var < <(dmenu -p 'Text: ')
我想这也适用于 zsh。
还有另一种解决方法:设置lastpipe设置并禁用作业控制
$ echo foo | read var; declare -p var
bash: declare: var: not found
$ set +o monitor
$ shopt -s lastpipe
$ echo foo | read var; declare -p var
declare -- var="foo"