16

オプションで明示的に指定することなく、次の動作が必要です。

xargs -d '\n'

ほとんどのコマンドとは異なり、パイプはエイリアスを認識しないため、エイリアスだけを使用することはできません (補足として、なぜこのように設計されているのでしょうか?)。私も独自の~/bin/xargsスクリプトを作成しようとしましたが、スクリプト内の文字列として「$@」を読み取るほど単純ではないと思います。

デフォルトで区切り文字を改行にする方法について何か提案はありますか? パスにスペースがある場合に大量のエラーを発生させたくありません (使用するfind ... -print0 | xargs -0と他の望ましくない影響があります)。

アップデート

私のシェルスクリプトの試みはこれです:

/usr/local/bin/xargs -d '\n' "$@"
4

3 に答える 3

14

xargs -d '\n' -n1 echoコマンドラインでテストしたところ、宣伝どおりに機能しました。入力を 1 行に分割してエコーします。

変数の割り当て中のシェルのエスケープに関する仮定に噛まれている可能性があります。たとえば、シェル スクリプトが次のような場合:

CMD="xargs -d '\n' -n1 echo"
cat 入力ファイル | $CMD

CMD 文字列全体を二重引用符で囲むと、区切り文字の単一引用符とバックスラッシュの両方が保持されるため、エラーが発生します。

xargs コマンドを引用符で囲んでいる場合は、次のように変更できます (単一引用符なし)。

CMD="xargs -d \n -n1 echo"
cat 入力ファイル | $CMD

必要に応じて機能する可能性があります。

CentOS 6.4、xargs バージョン 4.4.2 でテスト済み

于 2013-11-04T17:51:34.957 に答える
1

私は~/bin自分PATHのシステムのすべてのシェルからアクセスできるお気に入りのデフォルトを含む短いスクリプトを作成し、保持しています (さまざまな時期に Dash、Bash、Fish を使用しています)。それは小さいです:

!/usr/bin/env sh
exec xargs -rd\\n "$@"

スクリプトは、標準のデフォルトxを期待するスクリプトとの競合を避けるために呼び出されます。xargs自分自身を置き換えようとする場合はxargs、お勧めしませんが、 your~/binが system よりも PATH の上位に表示されるようにしてくださいxargs。私のシステムには だけが存在するwhich -a xargsことを教えてくれるので、ホーム ディレクトリ は次のようにその前に表示されなければならないことがわかっています。xargs/usr/bin/xargs/home/stephen/bin

$ echo "$PATH"
/home/stephen/bin:...:/usr/bin:...

find|x grepいずれにせよ、すべてのプログラムからアクセスできるスクリプトとして、これは、や などのことができることを意味しますsh -c 'x ...'

Bash を使用していて、エイリアスが必要な場合は、次のものを使用することもできます。

alias x=xargs -rd\\n\ # \n delim, don't run on empty in, + alias expansion

エイリアス展開の末尾のスペースに注意してください。これにより、エイリアスをチェーンできます。たとえば、上記のエイリアスに加えて、grep のエイリアスがあったg場合、次のように動作します。

# extended regex, skip binaries, devices, sockets, & dirs, colored, & line
# -buffered. use a non-canonical alias instead of GREP_OPTIONS which may wreck
# assuming scripts
alias g='grep -EID skip -d skip --color=auto --line-buffered'

$ find|x g foo

x/スクリプトのxargsアプローチだけでは、これを効果的に行うことはできません。

私はシェルを切り替えてほとんど 1 台の PC を使用するので、必要ないくつかのエイリアスを の個別のスクリプトとして保持し、シェルに依存しないエイリアスを、をソースと~/binするヘルパー スクリプトに保持します。これらはすべて Bash のようなエイリアス構文をサポートするためです。 . 定期的に複数の PC で作業している場合は、代わりにこれらを 1 つに統合しようとするでしょう。~/.sh_aliases~/.shrc~/.bashrc~/.config/fish/config.fish~/.bashrc

于 2016-05-01T00:01:23.373 に答える