改行文字を保存しながら、これらすべてをxclipに「パイプ」するにはどうすればよいですか?

改行文字を保存しながら、これらすべてをxclipに「パイプ」するにはどうすればよいですか?

だから私はバグを報告するときにシステム情報を得るためにこの便利な小さなコマンドを作成しました。

alias clip="xclip -selection clipboard -in"
alias bug="echo $(lsb_release -irs && uname -r && free --human --giga) | clip"

問題は2つあります。これを行わないと、echo $()すべてのコマンドの標準出力はキャプチャされず、最後のコマンドのみがキャプチャされます。ただし、これを行うと改行文字が削除され、読み取りがはるかに難しくなります。

また、$()エイリアスを実際に実行するとこのようになりますが、エイリアスなしでbug直接コマンドを実行するとそうではありません。

❯ bug                                                                                                                           # IdeaProjects
Fedora 33
zsh: 5.11.7-200.fc33.x86_64: command not found...
zsh: 10:20:16: command not found...
zsh: total: command not found...
zsh: Mem:: command not found...
zsh: Swap:: command not found...

代わりに対話式シェルで実行してください。

❯ echo $(lsb_release -irs && uname -r && uptime && free --human --giga) | clip                                                  # IdeaProjects

❯ Fedora 33 5.11.7-200.fc33.x86_64 10:39:11 up 3 days, 20:44, 1 user, load average: 0.70, 1.02, 0.97 total used free shared buff/cache available Mem: 15G 5.9G 2.3G 1.8G 7.6G 7.8G Swap: 12G 72M 11G

なぜ違うのか理解できませんね。

どのように単一のエイリアス/コマンドで作成し(この場合、関数が許可されると思いますかzsh?)、改行文字を保存するにはどうすればよいですか?

PSレポートの改善に関する提案がある場合は、いつでもコメントしてください。

答え1

サブシェルを使用してください:

alias bug="(lsb_release -irs && uname -r && free --human --giga) | clip"

clipこれはスペースを処理せずに、3つのコマンドすべての標準出力を送信します。

2つのエイリアスを組み合わせることができます。

alias bug="(lsb_release -irs && uname -r && free --human --giga) | xclip -selection clipboard -in"

free出力はあまり早くフォーマットされません。四捨五入すると、混乱が発生する可能性があります。

alias bug="(lsb_release -irs && uname -r && free) | xclip -selection clipboard -in"

エイリアスで発生する問題は、bugエイリアスを定義するときにコマンド置換が評価されるという事実に由来しますalias

$ alias
...
bug=$'echo Fedora 33\n5.11.7-200.fc33.x86_64\n              total        used        free      shared  buff/cache   available\n ...

したがって、別名は別名になります。

echo Fedora 33
5.11.7-200.fc33.x86_64
total used free shared buff/cache available
...

これは、引用した結果が得られる理由を説明します。このコマンドは再評価されないため、エイリアスを介さずに直接実行すると機能します。拡張は$(lsb_release ...)の引数として与えられecho、それはそのまま出力されます(シェルでスペースを処理した後)。

引用が重要です:

代替項目を二重引用符で囲んでいない場合、引数は出力を単語に分割するために使用されますIFS

したがって、alias bug="echo $(lsb_release ...)"改行文字が保存され、エイリアスを実行すると複数のコマンドが生成されますが、そうではありませecho $(lsb_release ...)ん(とにかくコマンドが再解釈されないため、これは重要ではありません)。

関連情報