【问题标题】:What part of this one-line script is specific to zsh?这个单行脚本的哪一部分是特定于 zsh 的?
【发布时间】:2021-04-19 02:36:25
【问题描述】:

我编写了一个名为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 是 #!/bin/zsh),它工作正常,但是当我使用 bash 运行它时,它不会将任何内容复制到我的剪贴板。其中哪一部分是 zsh-only,什么是 bash 等价物(如果有的话)?

【问题讨论】:

  • 都是 POSIX shell([[ .. ]] 不相关)——没有什么是 zsh 特定的。我怀疑当你从 bash 运行时你的 ENVIRONMENT 是不同的,并且它没有 X 环境存在(这是一个强烈的怀疑,但如果没有看到你的环境就无法验证)
  • @DavidC.Rankin [[ 不是 POSIX,但它是合法的 bash 运算符。
  • @ShaneBishop 好眼光 -- 已更新。
  • 我们可能需要查看sarcasm 的内容来确定问题。或者它可能与您的环境有关。您是否尝试过 echo -n 'test' | xclip -selection clipboard 使用交互式 bash shell 来排除问题?
  • 例如,echo $var 可能会产生稍微不同的结果。假设 var 包含文本 A B (4 个嵌入空格) ,那么它会在 zsh 下生成 A B,但在 bash 下会生成 A B (1 个空格)。

标签: bash shell zsh


【解决方案1】:

这部分:

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"

【讨论】:

  • 您的第一个建议,重定向进程替换的输出,奏效了!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
相关资源
最近更新 更多