【问题标题】:use comm and sort in zsh在 zsh 中使用 comm 和排序
【发布时间】:2020-03-07 18:42:47
【问题描述】:

我正在从 bash 迁移到 zsh。我遇到的困难之一是这个脚本,有人可以帮我写这个脚本吗? 我想使用 comm 命令执行 TARGET - PRUNE_FILE 操作:从 files.proj.bak 中删除行在 files.proj.bak 和 prunefile.conf 中。

TARGET=files.proj.bak
PRUNE_FILE=prunefile.conf

comm -23 <(sort files.proj.bak) <(sort prunefile.conf)

在 bash 中运行良好,但在 zsh 中,出现以下错误:

/Users/admin/Dropbox/loadrc.home/bashrc/cscope.sh: line 4: syntax error near unexpected token `('
/Users/admin/Dropbox/loadrc.home/bashrc/cscope.sh: line 4: `comm -23 <(sort files.proj.bak) <(sort prunefile.conf)'

【问题讨论】:

  • 这是 Zsh 中的有效语法。但是在 Zsh 中执行脚本并不意味着该脚本是由 Zsh 解释的。你需要向我们展示shebang。 head -1 /Users/admin/Dropbox/loadrc.home/bashrc/cscope.sh.
  • 等等,这就是整个脚本,没有 shebang(看到 comm 是第 4 行)?然后由 POSIX sh 执行。在脚本顶部添加#!/usr/bin/env zsh
  • 顺便说一句,这里有一个相关问题,其中包含一些技术细节,说明执行没有 shebang 的脚本时会发生什么:stackoverflow.com/questions/7268437/…。无论如何,这是非常糟糕的做法,所以不要这样做。
  • @4ae1e1 :我同意该脚本显然不是由 Zsh 运行的,因为如果是,错误消息将包含 zsh:。但是如果它是由 sh 运行的,错误消息会显示 sh: ...至少它在我的 sh 中是这样的。跨度>
  • @huangyingw : 你是如何运行脚本的?您在获取脚本时是否也会收到错误消息?

标签: zsh


【解决方案1】:

如果没有 shebang,脚本的执行方式取决于执行者。

bash 将尝试使用bash 本身执行它,它支持进程替换。

另一方面,zsh 尝试使用/bin/sh 执行脚本,这(即使它真的是bashsh 的名义运行) 支持进程替换。

解决方案是使用支持脚本中出现的任何语法的显式解释器运行脚本,例如

$ zsh cscope.sh

$ bash cscope.sh

或添加指定适当解释器的 shebang,例如 #!/bin/bash#!/bin/zsh

【讨论】:

  • 谢谢,是的,我需要将#!/bin/zsh 放在我的脚本文件的头部。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多