「ls」が突然空白を一重引用符で囲むのはなぜですか?

「ls」が突然空白を一重引用符で囲むのはなぜですか?

ls私のコンピュータの1つ(Debian Sidを実行している)でスペースを含むファイル名を入力するたびに、単一引用符で囲むことがわかりました。

すぐに別名を確認しましたが、そのまま残りました。

wyatt@debian630:~/testdir$ ls
'test 1.txt'  test1.txt
wyatt@debian630:~/testdir$ alias
alias ls='ls --color=auto'
alias wget='wget --content-disposition'
wyatt@debian630:~/testdir$

(図)

ファイル名に一重引用符がある別のテスト(jimmijからの要求への応答):

wyatt@debian630:~/testdir$ ls
'test 1.txt'  test1.txt  'thishasasinglequotehere'\''.txt'
wyatt@debian630:~/testdir$ touch "'test 1.txt'"
wyatt@debian630:~/testdir$ ls
''\''test 1.txt'\'''  test1.txt
'test 1.txt'          'thishasasinglequotehere'\''.txt'

(図)

新しいcoreutils-8.26出力に更新されました(明らかにあまり混乱しませんが、基本的にはまだ迷惑です)。この印刷物を提供してくれたPádraig Bradyに感謝します。

$ ls
"'test 1.txt'"   test1.txt
'test 1.txt'    "thishasasinglequotehere'.txt"

$ ls -N
'test 1.txt'  test1.txt
test 1.txt    thishasasinglequotehere'.txt

なぜこれが起こるのですか?どうすれば正しく予防できますか?

明確にするために、lsを自動カラー出力として直接設定しました。以前は、物事についての引用はありませんでした。

coreutils 8.25を実行していますbash

再コンパイルせずに解決する方法はありませんか?

編集:coreutils開発者が表示されます。選ぶ)習慣を破ってグローバルデフォルトにします。


アップデート - 2017年10月 - Debian Sidはデフォルトでシェルエスケープ引用符を再度有効にします。https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877582

以前のバグレポートのレスポンスチェーンの一番下には、「変更は意図的で維持されます」と記載されています。https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=813164#226

私はこれが修正されたと思いましたが、明らかに「安定した」Debianブランチが新しいリリースで他の修正などをインポートしながら「機能フリーズ」を維持できるように戻ったようです。だから(私の考えでは)恥ずかしいことです。

アップデート:2019年4月:発見したばかりPHPの誤ったエラー報告これはこれらの変更によって引き起こされますls。開発者を混乱させて不正なバグレポートを生成している場合は、変更を再評価する必要があるときだと思います。

アップデート:Android toyboxlsはこれと同様のことを行いますが、引用符の代わりにバックスラッシュを使用します。 -q オプションを使用すると、空白が「疑問符文字」としてレンダリングされるため、明らかに空白ではないので何かを確認しませんでした。この関数は、ls端末の列を使用し、1行に1つずつ印刷すると同時にパイプを介して実行されるため、ls文字通り空白を印刷します。

ls() {
    # only way I can stop ls from escaping with backslashes
    if [ -t 1 ]; then
        /system/bin/ls -C $@ |cat
    else
        /system/bin/ls $@ |cat
    fi
}

答え1

ヘッダー:このような回答に投票して終了することは非常に満足できるかもしれませんが、GNU coreutilsの管理者はSOの回答投票に興味がなく、安心してください。本当に欲しいならそれらを励ます変化、あなたはする必要があります彼らに電子メールを送るこの回答で説明されています。


2019アップデート:
昨年、管理者は努力を倍増し、今は誰でも利用できるようになりました。[Eメール保護]この問題に関するレポートは、以下を指す定型句の応答にすぎません。彼らはウェブサイトにこの変更が原因で起こっている問題をリストする非常に長いページを持っています。
連続圧力で[Eメール保護]このレポートは、この巨大で不機嫌なページを生成するよう強制し、おそらくこの問題に喜んで作業したい管理者の数を1人に減らすことに影響しました。
あまりにも多くの人が何かがバグだと思う場合、管理者の同意かどうかはバグです。
続ける彼らに電子メールを送る変化を促進する最も簡単な方法です。


なぜこれが起こるのですか?

いくつかのcoreutilsメンテナは、何十年もの間、事実上の標準よりもよく知っていると思います。


どうすれば正しく予防できますか?

http://www.gnu.org/software/coreutils/coreutils.html:

エラーレポート

Coreutilsでバグが見つかったと思われる場合は、可能な限り完全なバグレポートを次のアドレスに送信してください。<[Eメール保護]>、Coreutilsバグトラッカーに自動的に入力されます。バグを報告する前によくある質問をお読みください。バグレポートを作成し、良い質問をする方法に関する非常に便利でよく引用されるガイドは、Documentation How to Ask Question in a Smart Wayです。以前の投稿を参照して、bug-coreutilsアーカイブを検索できます。

既存のリリースまた正常に これは次のように変更されます。

影響を受けないディストリビューション:

  • openSUSE(-Nを使用)

再コンパイルせずに解決する方法はありませんか?

支持者はあなたができるようにします...

ls エイリアスに -N を追加して古い形式を復元します。

...すべての施設でどこにいても永遠に続きます。

答え2

あなたは選ぶことができます引用スタイル:

ls --quoting-style=literal

同じ:

ls -N

または:

QUOTING_STYLE=literal ls

エイリアスまたは8.25より前の動作を達成するにexport QUOTING_STYLE=literalは、で設定します。.bashrc

答え3

変更についてのいくつかです。

  • coreutils v8.25で導入され、v8.26でソートが改善されました。
  • 端末に出力するときにのみ発生するため、スクリプトは中断されません。
  • ユーザーのためのスペースを含むファイルの出力を明確にします。
  • 出力を衛生的に扱うので安全コピーして貼り付ける
  • 出力は常に効果的なコピーしてシェルに貼り付ける
  • ユーザーは、lsエイリアスに-Nを追加して古い形式を復元できます。

関連情報