Shell Scripting:在shebang中使用grep和tr

tom*_*KPZ 4 linux bash shell grep tr

我的系统上有这个脚本:

#! /bin/grep cat

caterpillar
cat
lol
morecat
Run Code Online (Sandbox Code Playgroud)

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

#! /bin/grep cat
caterpillar
cat
morecat
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用tr而不是脚本

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

caterpillar
cat
lol
morecat
Run Code Online (Sandbox Code Playgroud)

我希望得到

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

ceterpiller
cet
lol
morecet
Run Code Online (Sandbox Code Playgroud)

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

小智 8

shebang行只支持一个参数.字面上包含空格,没有引用.所以你在那里运行的命令与shell相同:

tr "'a' 'e'"
Run Code Online (Sandbox Code Playgroud)

如果你跑了,你会看到tr抱怨没有第二个参数.那么为什么你的剧本不抱怨?那是第二个问题.shebang cat或work grep因为cat并将grep输入文件的名称作为参数,shebang将脚本的名称添加到参数列表中.(这#!/bin/sh是执行脚本的基本情况所必需的/bin/sh scriptname)

你正在跑步

tr "'a' 'e'" yourscriptname
Run Code Online (Sandbox Code Playgroud)

它提供tr了它需要的2个参数,然后从stdin读取,从你不想要的一组字符翻译到你不想要的另一组字符.

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

#!/usr/bin/tr 'a' 'e' <
Run Code Online (Sandbox Code Playgroud)

添加到末尾的文件名将成为输入.但是shebang在内核中只是一个简单的东西,并不是那么特别.