【问题标题】:Escaping Shebang in grep在 grep 中逃离 Shebang
【发布时间】:2015-10-08 10:40:23
【问题描述】:

在一个 shell 脚本中,我试图找出另一个文件是否是一个 shell 脚本。我正在通过 grepping shebang 线来做到这一点。但我的 grep 语句不起作用:

if [[ $($(cat $file) | grep '^#! /bin' | wc -l) -gt 0 ]]
then 
echo 'file is a script!'
else 
echo "no script"
fi

我总是收到错误"bash: #!: command not found"。我尝试了几件事来逃避shebang,但没有奏效。

也许你能帮我解决这个问题? :)

干杯, 纳尔夫

【问题讨论】:

    标签: shell escaping character shebang


    【解决方案1】:

    我建议你把你的条件改成这样:

    if grep -q '^#! */bin' "$file"
    

    grep 的-q 选项在这种情况下很有用,因为它告诉 grep 不产生任何输出,如果模式匹配则成功退出。这可以直接和if一起使用;无需将所有内容都包含在测试 [[ 中(尤其不需要无用的使用 cat)。

    我还稍微修改了您的模式,以便 #!/bin 之间的空格是可选的。

    值得注意的是,如果匹配位于文件的不同行或使用另一个 shebang,这将产生误报。您可以通过管道 head -n 1 到 grep 来解决第一个问题,以便只检查第一行:

    if head -n 1 "$file" | grep -q '^#! */bin'
    

    如果您正在搜索已知的 shebangs 列表,例如/bin/sh/bin/bash,您可以将模式更改为 ^#! */bin/\(sh\|bash\)

    【讨论】:

    • 非常感谢您的回答。这对我有用:) 但我仍然不确定为什么grep -q '^#! */bin' 在这种情况下有效,而不是在我的代码行中。我仍然会使用你的,因为它更容易,但我想了解,为什么我的代码首先失败了......
    猜你喜欢
    • 1970-01-01
    • 2014-04-21
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 2017-02-02
    • 1970-01-01
    相关资源
    最近更新 更多