GNU/Linux >> Linux の 問題 >  >> Debian

Debian –「ls」が突然一重引用符で囲まれたスペースでアイテムをラップするのはなぜですか?

lsと入力するたびに、自分のマシンの1つ(Debian Sidを実行している)で気づきました。 スペースを含むファイル名には、一重引用符で囲みます。

私はすぐにエイリアスをチェックしましたが、それらが無傷であることがわかりました。

[email protected]:~/testdir$ ls
'test 1.txt'  test1.txt
[email protected]:~/testdir$ alias
alias ls='ls --color=auto'
alias wget='wget --content-disposition'
[email protected]:~/testdir$

(写真)

名前に一重引用符が含まれているファイルを使用した別のテスト(jimmijによる要求にも応答):

[email protected]:~/testdir$ ls
'test 1.txt'  test1.txt  'thishasasinglequotehere'''.txt'
[email protected]:~/testdir$ touch "'test 1.txt'"
[email protected]:~/testdir$ ls
''''test 1.txt''''  test1.txt
'test 1.txt'          'thishasasinglequotehere'''.txt'

(写真)

新しいcoreutils-8.26出力で更新します(これは確かにはるかに混乱が少ないですが、それでもデフォルトで持つのはイライラします)。このプリントアウトを提供してくれたPádraigBradyに感謝します:

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

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

なぜこうなった?どうすれば適切に停止できますか?

明確にするために、私自身、lsを自動的にカラー出力するように設定しました。以前は引用符で囲まれていませんでした。

bashを実行しています およびcoreutils8.25。

編集:
coreutilsの開発者は、驚き最小の原則と46年以上のUNIXの伝統を破ったにもかかわらず、それをグローバルなデフォルトにするのは良い考えだと考えたようです(リンク)。

再コンパイルせずにこれを修正する方法はありますか?

更新– 2017年10月–DebianSidはデフォルトでシェルエスケープクォートを再度有効にしました。これはばかげているだけです。 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877582

また、前回のバグレポートへの返信チェーンの最下部には、「変更は意図的なものであり、今後も継続されます」と記載されています。 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=813164#226

これで解決したと思いました。どうやらそうではありません。

更新:2019年4月:lsへのこの変更によって引き起こされたPHPの偽のバグレポートが見つかりました 。開発者を混乱させ、誤ったバグレポートを生成する場合は、変更を再考する必要があります。

更新:Androidおもちゃ箱ls 現在、これと同様のことを行っていますが、引用符の代わりに円記号を使用しています。 -qオプションを使用すると、スペースが「疑問符の文字」としてレンダリングされます(明らかにスペースではないため、チェックしていません)。したがって、問題のデバイスをルート化せずにこれまでに見つけた唯一の修正は、追加することです。これをスクリプトに追加し、シェルを起動するときにソースします。この関数はlsを作成します ターミナルにある場合は列を使用し、それ以外の場合はlsをだましながら、1行に1つずつ印刷します パイプを通り抜けているので、そのまま印刷スペースに入れます。

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

承認された回答:

序文 :このような回答に賛成票を投じて1日と呼ぶのは非常に満足のいくことかもしれませんが、GNU coreutilsのメンテナはSOの回答票を気にせず、実際に必要な場合は 変更するように促す 、メールで送信する必要があります この答えが説明するように。

2019年の更新
この1年のある時期に、メンテナは2倍になり、この問題に関する[メールで保護された]レポートに、この変更で人々が抱える問題を一覧表示するウェブサイトの非常に長いページを指す定型的な応答のみを提供するようになりました。彼らが無視することを約束したこと。
[メールで保護された]レポートからの絶え間ないプレッシャーが明らかに影響を及ぼし、この巨大でばかげたページの生成を余儀なくされ、問題に対処する意欲のあるメンテナの数が1人に減る可能性があります。
これほど多くの人が物事をバグと見なす場合、メンテナが同意しないかどうかにかかわらず、それはバグです。
引き続きメールで送信 変化を促す最も簡単な方法であり続けます。

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

関連:名前付きパイプ(catまたはtail -f)からの継続的な読み取り?

何人かのcoreutilsメンテナは、何十年にもわたるデファクトスタンダードよりもよく知っていると判断しました。

適切に停止するにはどうすればよいですか?

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

バグレポート

Coreutilsでバグを見つけたと思われる場合は、
できるだけバグレポートを完成させて<[メール保護]>に送信してください。 、そしてそれは
自動的にCoreutilsバグトラッカーに入力されます。
バグを報告する前に、FAQをお読みください。バグレポートを作成して適切な質問をする方法に関する非常に便利で頻繁に参照される
ガイドは、
ドキュメント「スマートな方法で質問する方法」です。以前の
投稿を閲覧し、bug-coreutilsアーカイブを検索できます。

すでに元に戻されたディストリビューション この変更:

  • Debian coreutils-8.25-2
    • その結果、おそらく、Ubuntuと数百のDebianベースおよびUbuntuベースの派生物すべてが含まれます

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

  • openSUSE(すでに使用されている-N)

再コンパイルせずにこれを修正する方法はありますか?

支持者はあなたを持っているでしょう…

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

…すべてのインストールで、どこでも、残りの永遠に。


Debian
  1. ClamAVアンチウイルスでDebianを保護する

  2. 引用符を使用すると、なぜ単一の円記号が表示されるのですか?

  3. 一重引用符で展開される bash 変数の問題

  1. sedで一重引用符を別の文字に置き換えるにはどうすればよいですか?

  2. 一重引用符と二重引用符の両方を含む bash エイリアス コマンド

  3. sed すべてのタブとスペースを単一のスペースに置き換えます

  1. Debian10でUFWを使用してファイアウォールを設定する方法

  2. Debian9でUFWを使用してファイアウォールを設定する方法

  3. DebianSqueezeでmylvmbackupを使用してMySQLデータベースをバックアップする方法