この回答の価値は、OPコードの問題点を説明することにあります。
- カスタムシェル機能を必要とせずに、配列の要素に行単位で入力を直接読み込むために、Bash v4 +の組み込みmapfile
(またはその有効なエイリアスreadarray
)の使用を示しています。
- Bash v3.xでは、IFS=$'\n' read -r -d '' -a lines < <(...),
を使用できますが、空の行は無視されることに注意してください。
あなたの主な問題は、$1
の引用符で囲まれていない(非二重引用符で囲まれた)の使用は、シェルが効果的に空白のすべての実行を正規化し、その内容にword-splittingを適用可能ということである - 改行を含む - 1つのスペースにそれぞれ、の入力ラインのwhile
ループへの単一の結果となります。
二次的に、$input
を引用符で囲まずに使用すると、このワード分割がecho
の出力に再び適用されます。
最後に、$IFS
、内部フィールドセパレータを空の文字列(IFS= read -r line
経由)に設定せずにread
を使用することによって、各入力行から空白が切り取られます。言っ
、あなたは標準入力ではなく、引数取ってから直接読み取るためにあなたの機能を簡素化することができます使用
get_lines < <(loginctl list-sessions)
:process substitutionを使用して、次のようにあなたがして呼び出すことができます
function get_lines {
while IFS= read -r line; do
printf '%s\n' "$line"
done
}
をパイプラインも機能しますが、get_lines
はサブシェルで実行されます。つまり、に現在表示されている変数を設定することはできません。シェル:
loginctl list-sessions | get_lines
++が、末尾をキャプチャしないように、あなたは' -t'を追加する必要があります
は、参考文献各入力ラインと共に、 'readarray'にはBash 4.xが必要です。 – mklement0
素晴らしいですね。私は '<<(' part。)何をしますか? – 8thperson