web-dev-qa-db-ja.com

`ls`のスペース埋め込みデータを含む` zenity`リストダイアログをロードするにはどうすればよいですか?

データにスペースが含まれている場合、zenity List Dialogの読み込みに問題があります。

リストされたデータにスペースがない場合は簡単です。
しかし、スペースが埋め込まれたファイル名の簡単な/標準的な方法を知りません。

何らかの理由で、$(ls -Q /tmp)(引用された出力)の出力はまだ
すべてのスペースでファイル名を分割します。の引用符とバックスラッシュ
ls | sed出力は、「最終的な文字列」としてではなく、
「読み取り可能なデータ行」として(最初の2つのデータ行のように)...

「問題を回避する」ことができましたが、おそらく自己修正コード
は最善の方法ではありません! (それは楽しいけれども!:)


動作しない方法は次のとおりです

zenlist="/tmp/zen list"; touch "$zenlist"
zenity --list --title='A single-column List' --width=600 --height=450 \
--column='Spaces are allowed within "q u o t e s"' \
"How much wood would a woodchuck chuck," \
"if a wooodchuck could chuck wood?" \
$(ls -Q -1 "$zenlist"* |sed 's/$/ \\/')
echo ""
# rm "$zenlist"  # Uncomment this line to delete the file

この方法は機能しますが、「従来の」(より良い)方法が必要です!?

zenlist="/tmp/zen list"
echo "zenity --list --title='A single-column List' --width=600 --height=450 \\" >"$zenlist"
echo "--column='Spaces are allowed within \"q u o t e s\"' \\"       >>"$zenlist"
echo "\"How much wood would a woodchuck chuck,\" \\"       >>"$zenlist"
echo "\"if a wooodchuck could chuck wood?\" \\" >>"$zenlist"
(ls -Q "$zenlist"* |sed 's/$/ \\/')   >>"$zenlist"
echo "" >>"$zenlist"
source "$zenlist"
# rm "$zenlist"  # Uncomment this line to delete the file
5
Peter.O

問題はlsです。スクリプトで使用するようには設計されていません。それに、スクリプトでlsを使用するのも無意味です。なぜなら、シェルは単にグロブを使用するだけで、仕事をはるかに改善できるからです。 http://mywiki.wooledge.org/BashGuide/Patterns

zenlist="/tmp/zen list"; touch "$zenlist" "$zenlist"$'\neven with a newline'
zenity --list --title='A single-column List' --width=600 --height=450 \
       --column='Spaces are allowed within "q u o t e s"' \
       "How much wood would a woodchuck chuck," \
       "if a wooodchuck could chuck wood?" \
       "$zenlist"*

また、スペースやその他の文字を含むリスト項目を「変数」に入れる一般的な方法には、bash配列を使用します。

# assign some items to start with
items=( "How much wood would a woodchuck chuck," "if a wooodchuck could chuck wood?" )

# append some items
items+=( "$zenlist"* )

zenity --list --title='A single-column List' --width=600 --height=450 \
       --column='Spaces are allowed within "q u o t e s"' "${items[@]}"
5
geirha

次のように、リストのコンテンツをパイプで禅に変換できます。

(echo "How much wood would a woodchuck chuck," ; \
 echo "if a wooodchuck could chuck wood?" ; \
 ls -Q -1 "$zenlist"* |sed 's/$/ \\/') \
| zenity --list --title='A single-column List' --width=600 --height=450 \
         --column='Spaces are allowed within "q u o t e s"'
5
Florian Diesch