私は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行の末尾の影響を受けます。確認するこの問題。