なぜ 'ls'はアイテムを一重引用符でスペースで突然ラップするのですか?


187

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

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

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á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を自動的にカラー出力に設定しました。以前は物事を引用符で囲みませんでした。

bashcoreutils 8.25を実行しています。

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

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


更新-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

これは解決したと思いました。どうやら。

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

更新:Android toybox lsは、これと同様のことを行っていますが、引用符ではなくバックスラッシュを使用しています。-qオプションを使用すると、スペースが「疑問符文字」としてレンダリングされます(明らかにスペースではないため、それらを確認していません)。これをスクリプトに追加し、シェルを起動するときにソースとして使用します。この関数はls、端末の場合は列を使用し、そうでない場合は1行に1つずつls印刷しますが、パイプを介して実行されるため、逐語的に印刷スペースをtrick します。

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
}

20
lsコマンドを解析しない別の理由。
-jimmij

12
奇妙に見えますが、端末への印刷時にのみ有効にすると意味があります。ファイル「test」と別の「1.txt」ではなく、ファイル「test 1.txt」があることがはっきりとわかります。ls | cat消えるかどうか試してみてください。タイムマシンがあれば、Bell Labs〜1970に戻り、ファイル名とディレクトリ名にスペースを許可するのは悪い考えだとケントンプソンに納得させようとしました。:-P
ビョルン・ムンク

6
これを初めて見たとき、スクリプトの1つが異常になり、すべてのファイルの名前をに変更したと考えて、びっくりしました'*'。私は私が追加周りに行きますねls...それを取り除くためにすべての私のマシンにエイリアスを
限定贖罪の

14
Lekensteynが指摘したように@ LimitedAtonementQUOTING_STYLE=literalは、エイリアスではなく環境変数を使用してこれを行うことができます。(それは好みの問題だと思いますが、私は変数を好みます。)
LSpice

4
@BjornMunchには、ファイルが1つなのか2つなのかを判断する問題に対する2つの解決策があります。2)行ごとに1つの項目をリストします。これらはどちらも、単一引用符を使用したマングリングよりも良く見えます。
Wyatt8740

回答:


132

はじめていること、それはこのような答えをupvoteし、一日、それを呼び出すためには非常に満足のいくかもしれないが、GNUの開発者がSO票に答える気にしないのでご安心くださいは、&​​:あなたが実際にしたい場合にそれらを奨励するために変更、必要にこの回答に記載されているとおりにメールしてください


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

数人のcoreutils開発者は、数十年にわたる事実上の標準よりもよく知っていると判断しました。


どうすれば適切に停止できますか?

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

バグレポート

Coreutilsでバグを見つけたと思われる場合は、可能な限り完全なバグレポートを<bug-coreutils@gnu.org>に送信してください。バグレポートは自動的にCoreutilsバグトラッカーに入力されます。バグを報告する前に、FAQを読んでください。バグレポートの作成方法と良い質問の方法に関する非常に便利でよく参照されるガイドは、「How To Ask The Smart Way」というドキュメントです。以前の投稿を閲覧し、bug-coreutilsアーカイブを検索できます。

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

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

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

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

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

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

…残りのすべての場所で、すべてのインストールで。


17
この変更はメーリングリストで提案され、3人のcoreutilsメンテナーによって純利益になることで合意されました。私たちはこれについて建設的な議論を受け入れています。結局のところ、これはオープンソースであり、口述することを意味するものではなく、物事を改善するためだけのものです。でcoreutilsのスレッドで対応すること自由に感じてくださいlists.gnu.org/archive/html/coreutils/2016-02/msg00000.html方法BTW(挙げる美的欠点の1に改善するための建設的な提案があったが、アライメントを改善するためにスペースを追加することにより)
パドレイグブレイディ

31
@PádraigBrady回答を更新しました。ただし、coreutilsスレッドで拒否の負荷を確認します。一番下の行は、人々のためにより多くの仕事を作成しており、あなたは1970年からのOSのクローンであるOSの名前でそれをやっているということです。
Jan Kyu Peblik

43
@PádraigBradyこの変更は私に迷惑をかけ、原因と解決策を見つけるために数時間を無駄にしました。私はネガティブになるつもりはありません-他の人の視点を共有しているだけです!コアの挙動を変更すると、巨大な意味合いを持っている...
mafrosis

52
* nixシステムを30年間使用している人として、このような無償の変更は非常に迷惑であると感じています。一つには、長年のスクリプトを壊します。彼らはまた、最低驚きの原則にも違反しています。上記のように、ここでは「オプトイン」がデフォルトになっているはずです。
ブライアンクラッパー

28
@PádraigBradyそれはまだそのような変更をプッシュする方法ではありません。それはされていると思います方法デフォルトでは、その動作のオプトインの代わりに、積極的に持っているより建設。また、これはファイル名の保存方法であるという誤ったヒントを示します。要するに、ファイル名lsの保存方法が見えなくなったということです。この機能オプションであり、デフォルトではありません

91

引用スタイルを選択できます:

ls --quoting-style=literal

と同じ:

ls -N

または:

QUOTING_STYLE=literal ls

それをエイリアスにするか、またはに設定export QUOTING_STYLE=literalして.bashrc8.25より前の動作を実現します。


11
私は通常のunix-yの動作を得るためにそれをしなければならない少し奇妙なようです。また、古いデフォルトが必要です。エスケープは古いデフォルトではないと思います-実際にそこにあったものを正確に印刷したと思います。
Wyatt8740

9
8.25より前の動作についてexport QUOTING_STYLE=literalは、bashrc で使用してください。
-Lekensteyn

2
または使用-Nするようです。既に個人用リポジトリが設定されているので、自分のバージョンをコンパイルしています。
Wyatt8740

2
@LSpiceのliteral代わりに使用する投稿を編集しましたescape(@cuonglmは、特にescapeスタイルをターゲットにするのではなく、スタイルを変更する方法を示したかっただけだと思います)。
Lekensteyn

5
この答えは、より多くの賛成に値します。それは、質問者が官僚的な答えを避けて尋ねたことにまっすぐに対処します。実際、環境変数のアプローチはかなりエレガントに見えます。(私は個人的にはより効率的なC&Pアクションを好むため、新しい動作を好みます)、それでもlsはリダイレクションが使用されるときに古い方法で動作するのに十分賢いので、lsの出力を使用するスクリプトに害はありません。
マルセロ

42

変更に関するいくつかのポイント。

  • coreutils v8.25で導入され、v8.26でアライメントが改善されました。
  • 端末に出力するときにのみ発生するため、スクリプトを中断しません
  • 空白を含むファイルのユーザーの出力を明確にします
  • 出力をサニタイズするので、コピーして貼り付けても安全です
  • コピーしてシェルに貼り付けるために、出力が常に有効になりました
  • ユーザーは、lsエイリアスに-Nを追加することで、古い形式に戻すことができます

7
私の最後の例は曖昧ではありませんか?おそらくそうではありません-しかし、確かに混乱を招き、解読に時間がかかります。それはひどい変化だと思います(あなたを意図した攻撃はありません)。エイリアスのヒントをありがとう。
Wyatt8740

27
注:この変更はcoreutils 8.25で導入されました(この投稿と同じPádraigによって作成されたcommit)。個人的には、この動作は最適ではなく、ファイル名にスペースが含まれる場合は常にアライメントが崩れると思います。
-Lekensteyn

10
謝罪-少なくともシェルクォートを安全にシェルクォートしているようです。私はまだそれが好きではありません。オプションは問題ありませんが、数十年前のUNIXコアユーティリティの非常によく指定されたデフォルトの動作を、その正確性を低下させるような方法で変更することは、悪い考えにすぎません。
mikeserv

12
@PádraigBradyそれで、あなたはls壊れ続けるつもりですか?あなたの変更に対するこれらすべての議論を見てください。誰も欲しくない。おそらく、世界に謝罪し、それを取り消す時が来たのでしょう。
クリスウォリック

6
@PádraigBradyだから、これが間違っている、壊れているなどを説明した多くの人々にもかかわらず、デフォルトを変更しないようにこれを元に戻さないのですか?あなたの考えに反して、この変更曖昧さを排除するものではありません。環境変数またはエイリアスを設定することを提案するのは、せいぜい最高です。
マーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.