这个单行脚本的哪一部分是特定于 zsh 的?
What part of this one-line script is specific to 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 是 #!/bin/zsh
),它工作正常,但是当我运行 它与 bash,它不会将任何内容复制到我的剪贴板。其中哪一部分是仅 zsh 的,bash 等价物是什么(如果有的话)?
这部分:
echo "dmenu -p 'Text: '" | sh | read var
# ............................^^^^^^^^^^
在 bash 中,管道中的每个命令在单独的子 shell 中 运行。因为var
变量设置在subshell中,当subshell退出时变量消失。
要在 bash 中执行它,重定向进程替换的输出:这样,shell 中的 read
命令 运行s。
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"
我写了一个名为 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 的,bash 等价物是什么(如果有的话)?
这部分:
echo "dmenu -p 'Text: '" | sh | read var
# ............................^^^^^^^^^^
在 bash 中,管道中的每个命令在单独的子 shell 中 运行。因为var
变量设置在subshell中,当subshell退出时变量消失。
要在 bash 中执行它,重定向进程替换的输出:这样,shell 中的 read
命令 运行s。
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"