4

すべての bash スクリプトを見つけて (現在、それらの多くを蓄積しています)、それらをすべてbash -n自動的に実行したいと考えています。

これを行う簡単な方法は何ですか?最初の非空白行がor or or ...grepで始まるファイルのみに一致させたい#!/bin/sh#!/usr/bin/env sh#!/usr/bin/env bash#!/bin/bash

サービス可能な答えはもちろん、

for file in *; do 
    if head -n 5 $file | grep "#!.*sh$" > /dev/null; then
        bash -n $file
    fi
done

しかし、「正確さ」のために、最初の非空白 (または非空白)行のみでgrep を合理的に実行するにはどうすればよいでしょうか?

4

2 に答える 2

3

検索の使用:

     find . -type f -exec grep -e "^#\!\/bin\/.*sh$" {} +
于 2013-06-08T03:28:54.927 に答える
2

GNU awk

awk '
FNR==1 && $0~/#!\/bin\/sh|#!\/usr\/bin\/env sh|#!\/usr\/bin\/env bash|#!\/bin\/bash/ { 
    print FILENAME " is shell script";
}
FNR>1 {
    nextfile
}' *
  • 上記regexをいじって、ちょうどに減らすことができ#!ます。
  • FNR==1とともにregex、最初の行が行に対してチェックされるようにしshe-bangます。
  • nextfileファイルが最初の行を超えて検索されないようにします。
  • printロギングのためだけの場合。
  • FILENAME検査中のファイルの名前を出力します。
  • *作業ディレクトリの下のすべてのファイルにグロブします。
于 2013-06-08T02:35:59.250 に答える