繁体   English   中英

这个单行脚本的哪一部分是特定于 zsh 的?

[英]What part of this one-line script is specific to zsh?

我编写了一个名为sarcasm的简单程序,它只获取其所有 arguments,将它们连接起来,然后使用 '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 是#!/bin/zsh ),它工作正常,但是当我使用 bash 运行它时,它不会复制任何内容到我的剪贴板。 其中哪一部分是仅 zsh 的,等效的 bash 是什么(如果有的话)?

这部分:

echo "dmenu -p 'Text: '" | sh | read var 
# ............................^^^^^^^^^^

在 bash 中,管道中的每个命令都在单独的子 shell 中运行。 因为var变量是在子 shell 中设置的,所以当子 shell 退出时变量消失。

要在 bash 中执行,重定向进程替换的 output:这样, 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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM