bash コマンドのネストした文字列

bash コマンドのネストした文字列

Pythonファイルのすべてのshebang行を一覧表示するスクリプトを作成しようとしています。

私がしたいことは

sudo bash -c 'for logf in $(find / -name "*.py"); do fgrep '#!/usr/bin' "$logf"; done'

これによりエラーが発生しますbash: !/usr/bin': event not found。エラーの意味は不明ですが、理由を理解しています。

bash問題は、コマンドを実行せずに他の文字列を含む文字列を渡す方法がわからないことです。

「#!」を省略すると動作しますが、もちろん他の多くの行も含まれます。

私はエスケープと文字列のほぼすべての組み合わせを試しましたが、成功しませんでした。

ベストアンサー1

コメントありがとうございます。動作する2つのバージョンがあります。いくつかの変更を適用し(行の先頭のshebangのみを確認し)、shebangの後にスペースを入れました。

sudo bash -c 'for logf in $(find / -name "*.py"); do grep '^\\#\\!/usr/bin' "$logf"; done'

何らかの理由で shebang の後にスペースを残そうとすると、正常に動作しません。

より良い(そしてより簡単)

sudo find / -name "*.py" -exec grep '^#! */usr/bin' {} \;

おすすめ記事