【问题标题】:Shell Scripting: Using grep and tr in the shebangShell 脚本:在 shebang 中使用 grep 和 tr
【发布时间】:2014-04-21 04:21:53
【问题描述】:

我的系统上有这个脚本:

#! /bin/grep cat

caterpillar
cat
lol
morecat

当我运行它时,我得到了预期的输出,

#! /bin/grep cat
caterpillar
cat
morecat

但是,如果我使用 tr 来代替脚本

#! /usr/bin/tr 'a' 'e'

caterpillar
cat
lol
morecat

我希望得到

#! /usr/bin/tr 'a' 'e'

ceterpiller
cet
lol
morecet

但是没有打印任何内容,如果我手动输入cat,我会得到c/t。如何将脚本更改为像第一个一样?

【问题讨论】:

  • 因为grep 接受文件参数,但tr 不接受。

标签: linux bash shell grep tr


【解决方案1】:

shebang 行仅支持单个参数。空格是按字面意思包含的,没有引用。因此,您在那里运行的命令等同于 shell:

tr "'a' 'e'"

如果你运行它,你会看到tr 抱怨缺少第二个参数。那么为什么你的脚本没有抱怨呢?嗯,这是第二个问题。 shebang catgrep 有效,因为 catgrep 将输入文件的名称作为参数,并且 shebang 将脚本的名称添加到参数列表中。 (对于要以/bin/sh scriptname 执行的#!/bin/sh 脚​​本的基本情况,这是必需的)

因此你正在跑步

tr "'a' 'e'" yourscriptname

它为tr 提供了它需要的 2 个参数,然后它从标准输入中读取,从一组你不想要的字符转换为另一组你不想要的字符。

如果 shebang 行有一个功能齐全的 shell 解析器,你可以使用

#!/usr/bin/tr 'a' 'e' <

添加到末尾的文件名将成为输入。但是shebang只是内核中的一个简单的东西,没有那么有特色。

【讨论】:

  • 谢谢!这也可以解释为什么还会打印“#! /bin/bash cat”。
最近更新 更多