_ls | xargs -n1 -p rm
_があるとしましょう。yes
または_yes n
_を使用して、_-p
_フラグによって生成された質問に自動的に回答するにはどうすればよいですか?
yes n | (ls | xargs -n1 -p rm)
を試しましたが、機能しませんでした。
[〜#〜] update [〜#〜]:質問は実際にはrm
に関するものではなく、yes
を適切に使用する方法に関するものです。 _xargs -p
_を使用するエイリアスまたは関数があり、それを実行する前に、それが何をしているかを尋ねて表示するという事実が気に入っています。それが何をするかがわかったら、yes
を使用して、関数内のすべての_xargs -p
_を自動的に処理できるようにしたいと思います。したがって、この例ではrm
を使用していますが、実際にはそれについてではありません。
また、明確にするために、_-p
_を使用する、または使用しないようにエイリアスまたは関数を変更したくありません。私はむしろ外部からyesを入力します。
Tbh _yes | some_function_asking_me_questions
_やsome_function_asking_me_questions <( yes )
のようなものが機能すると思いましたが、機能しませんでした。
2番目の編集:別の例:次のようなリージョンのAWSSNSトピックを一覧表示するエイリアスがあります。
_alias delete_snstopics="list_sns | cut -f 2 | xargs -n1 -p aws sns delete-topic --topic-arn "
_
次に、AWSのリージョンごとに、それらのSNSトピックの削除を検索してプロンプトを表示する関数があります。 SNSトピックのIDは毎回異なり、問題が発生した場合はWebコンソールでSNS IDを照合できるため、xargsが実行される_aws sns delete-topic --topic-arn $1
_を確認したいと思います。さらに、特定の地域のSNSトピックを削除したくない場合があります。そのため、この関数でyes
を使用して、部分的な削除と完全な削除に同じ関数を使用しても、有用な出力を取得できるようにします。意味がありますか?
コマンドを分析してみましょう:
yes n | (ls | xargs -n1 -p rm)
パイプラインls | xargs -n1 -p rm
にはls
が標準入力を読み取りますが、標準出力はxargs
にリダイレクトされ、標準入力として扱われ、標準出力は変更されません。
ここで、yes
の出力をこのパイプラインにパイプします。そのパイプラインの標準入力はls
に入り、それを読み取らないため、xargs
はそれを見ることができません。
ここで明らかな質問は次のとおりです。xargs
は、コマンドを実行するかどうかをどのように尋ねることができますか?結局のところ、その標準入力(プログラムは通常ユーザーインタラクションを読み取る)は、ls
!の出力を読み取るようにリダイレクトされます。
答えは、xargs
は、ターミナルファイル/dev/tty
を直接開くだけで、これらの質問のリダイレクトメカニズムをバイパスするということです。したがって、確認入力はファイルリダイレクトの影響を受けません。
xargs
に入力するには、プログラムによって制御される端末デバイスでプロセスを提示できるプログラムが必要です。非常に強力な(しかし非常に複雑な)そのようなプログラムはexpect
です。残念ながら、私はあなたが望むものを達成するためのより簡単な方法を知りません。
次を使用できます。
ls | xargs -n1 rm -r
そして、これはディレクトリまたは/およびファイルに対して機能します。