Bashの最後のパラメータから改行文字を削除する方法は?

Bashの最後のパラメータから改行文字を削除する方法は?

私はwsl bashを使用しており、私のファイル~/.bashrcには次の関数が定義されています。

function clip { /mnt/c/Windows/System32/clip.exe "${@%\n}"; }

\nただし、パラメータの末尾は削除されません。私の特定の要件を満たすためにどのように改善できますか?

非常にありがとう

編集:助けを借りてカミールその答えを通して、私は正確に何が起こっているのかを知ることができました。生成されたサブプロセス(cmd.exe)が挿入されていたキャリッジリターンを追加していたことがわかりましたclip.exe(Pipes.ex.を使用していたためですpwd | clip)。

次のことで目的の結果が得られました。

function clip { /mnt/c/Windows/System32/WindowsPowershell/v1.0/powershell.exe Set-Clipboard "${@:-$(cat)}"; }

依存しているので少し遅いです。

  • 電源装置ハウジング
  • cat(外部バイナリは組み込み読み取りに置き換える必要があります)

しかし、私の要求によると、これは問題ではありません。 :)

ベストアンサー1

"${@%\n}"n末尾の文字(改行文字ではなくリテラル文字列)が削除さ"${@%\\n}"れます。\n

改行を削除するには、改行を渡す必要があります。 Bashでは、次の構文が機能します。

"${@%$'\n'}"

どこ$'\n'実際の改行作成を担当します。リテラル改行も機能します。

"${@%
}"

メモ:

  • このソリューションは、最後のパラメータだけでなく、すべてのパラメータから末尾の改行文字を削除します(これがうまくいくため$@です)。
  • Linuxでは、コマンドライン引数の末尾の改行は一般的ではありません。私はWSLも知らず、あなたのユースケースもわかりません。*欲しいものが何であるかを知ってほしい。

例:

$ set a $'b\n' c
$ printf '<%s>\n' "$@"
<a>
<b
>
<c>
$ printf '<%s>\n' "${@%$'\n'}"
<a>
<b>
<c>
$ printf '<%s>\n' "${@%
}"
<a>
<b>
<c>


\n*「パラメータから末尾の削除」が望まない場合おそらく(ソース?)スクリプトから関数を呼び出すと、スクリプトはDOS行の末尾の影響を受けます。確認するこの問題

おすすめ記事