Tại sao 'ls' đột nhiên gói các mục với khoảng trắng trong dấu ngoặc đơn?


187

Tôi chỉ nhận thấy rằng trên một trong các máy của mình (chạy Debian Sid) bất cứ khi nào tôi nhập lsbất kỳ tên tệp nào có dấu cách đều có dấu ngoặc đơn xung quanh nó.

Tôi ngay lập tức kiểm tra bí danh của mình, chỉ để thấy chúng còn nguyên vẹn.

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$

(hình ảnh)

Một thử nghiệm khác, với các tệp chứa dấu ngoặc đơn trong tên của họ (cũng trả lời yêu cầu của 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'

(hình ảnh)

cập nhật với đầu ra coreutils-8.26 mới (được thừa nhận là ít gây nhầm lẫn hơn, nhưng vẫn gây khó chịu theo mặc định). Cảm ơn Pádraig Brady cho bản in này:

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

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

Tại sao chuyện này đang xảy ra? Làm thế nào để tôi dừng nó đúng cách?

Để làm rõ, bản thân tôi đặt ls thành đầu ra màu tự động. Nó không bao giờ đặt dấu ngoặc kép xung quanh những thứ trước đây.

Tôi đang chạy bashvà coreutils 8.25.

EDIT: Xuất hiện các nhà phát triển coreutils nghĩ rằng (liên kết) sẽ là một ý tưởng tốt để biến nó thành một mặc định toàn cầu mặc dù phá vỡ nguyên tắc ít gây ngạc nhiên cũng như hơn 46 năm truyền thống UNIX.

Bất kỳ cách nào để khắc phục điều này mà không cần biên dịch lại?


CẬP NHẬT - Tháng 10 năm 2017 - Debian Sid đã kích hoạt lại trích dẫn thoát vỏ theo mặc định. Chuyện này ngày càng trở nên tức cười. https://bugs.debian.org/cgi-bin/orpreport.cgi?orms=877582

Và ở dưới cùng của chuỗi trả lời cho báo cáo lỗi trước đó, "sự thay đổi là có chủ ý và sẽ vẫn còn." https://bugs.debian.org/cgi-bin/ormsreport.cgi?orms=813164#226

Tôi nghĩ rằng điều này đã được giải quyết. Rõ ràng là không.

CẬP NHẬT: Tháng 4 năm 2019: Chỉ cần tìm thấy một báo cáo lỗi siêu cấp trong PHP được gây ra bởi thay đổi này ls. Khi bạn gây nhầm lẫn cho các nhà phát triển và tạo báo cáo lỗi sai, đã đến lúc nghĩ lại những thay đổi của bạn.

Cập nhật: Android toybox lshiện đang làm một cái gì đó tương tự như thế này nhưng với dấu gạch chéo ngược thay vì dấu ngoặc kép. Sử dụng tùy chọn -q làm cho không gian hiển thị dưới dạng 'ký tự dấu hỏi' (Tôi chưa kiểm tra xem chúng là gì, vì rõ ràng chúng không phải là khoảng trắng), do đó, cách khắc phục duy nhất tôi tìm thấy cho đến nay mà không cần root thiết bị trong câu hỏi là thêm Điều này đến một kịch bản và nguồn nó khi khởi chạy một shell. Hàm này lssử dụng các cột nếu trong một thiết bị đầu cuối và nếu không thì in một dòng trên mỗi dòng, trong khi lừa lsvào các không gian in nguyên văn vì nó chạy qua một đường ống.

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
Một lý do khác tại sao không phân tích cú pháp lslệnh.
jimmij

12
Nó trông lạ nhưng nếu nó chỉ được kích hoạt khi in ra thiết bị đầu cuối thì nó có ý nghĩa. Bạn có thể thấy rõ rằng bạn có một tệp 'test 1.txt' chứ không phải là một tệp 'test' và một '1.txt' khác. Hãy thử ls | catvà xem nếu nó đi. Nếu tôi có một cỗ máy thời gian, tôi sẽ quay lại Bell Labs ~ 1970 và cố gắng thuyết phục Ken Thompson rằng cho phép không gian trong tên tệp và thư mục là một ý tưởng tồi. :-P
Bjorn Munch

6
Khi tôi lần đầu tiên nhìn thấy điều này, tôi đã bối rối, nghĩ rằng một trong những kịch bản của mình đã bị sai lệch và đổi tên tất cả các tập tin của tôi thành '*'. Tôi đoán tôi sẽ đi xung quanh để thêm lsbí danh cho tất cả các máy của mình để loại bỏ nó ...
Sự Chuộc Tội có giới hạn

14
@LrictAtonement, như được chỉ ra bởi Lekensteyn , bạn có thể làm điều này với một biến môi trường thay QUOTING_STYLE=literalvì bí danh. (Tôi đoán đó là vấn đề của hương vị, nhưng tôi thích biến số hơn.)
LSpice 15/2/2016

4
@BjornMunch có hai giải pháp cho vấn đề cho biết đó là một hay hai tệp: 1) hãy tìm cách các cột được vẽ và nó khá rõ ràng. 2) liệt kê một mục trên mỗi dòng. Cả hai đều trông tốt hơn và rõ ràng hơn so với xáo trộn với dấu ngoặc đơn.
Wyatt8740

Câu trả lời:


132

Lời nói đầu : Mặc dù có thể khá hài lòng khi đưa ra một câu trả lời như thế này và gọi nó là một ngày, xin hãy yên tâm rằng các nhà phát triển GNU không quan tâm đến phiếu trả lời SO, và nếu bạn thực sự muốn khuyến khích họ thay đổi , bạn cần phải gửi email cho họ như câu trả lời này mô tả.


" Tại sao điều này xảy ra? "

Một số nhà phát triển coreutils quyết định họ biết rõ hơn hàng thập kỷ về tiêu chuẩn thực tế.


" Làm thế nào để tôi dừng nó đúng cách? "

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

Báo cáo lỗi

Nếu bạn nghĩ rằng bạn đã tìm thấy một lỗi trong Coreutils, thì vui lòng gửi báo cáo lỗi đầy đủ nhất có thể tới <bug-coreutils@gnu.org> và nó sẽ tự động được nhập vào trình theo dõi lỗi của Coreutils. Trước khi báo cáo lỗi xin vui lòng đọc FAQ. Một hướng dẫn rất hữu ích và thường được tham khảo về cách viết báo cáo lỗi và đặt câu hỏi hay là tài liệu Cách đặt câu hỏi theo cách thông minh. Bạn có thể duyệt các bài đăng trước đó và tìm kiếm kho lưu trữ bug-coreutils.

Các bản phân phối đã hoàn nguyên  thay đổi này:

Không bị ảnh hưởng:

  • openSUSE (đã được sử dụng -N)

" Bất kỳ cách nào để khắc phục điều này mà không cần biên dịch lại? "

Những người đề xuất sẽ có bạn ...

quay lại định dạng cũ bằng cách thêm -N vào bí danh ls của họ

Trên tất cả các bản cài đặt của bạn, ở mọi nơi, cho đến cuối đời.


17
Sự thay đổi đã được đề xuất trong danh sách gửi thư và được ba người duy trì coreutils đồng ý là một lợi ích ròng. Chúng tôi hoàn toàn cởi mở với các lập luận mang tính xây dựng về điều này. Rốt cuộc đây là nguồn mở, chúng tôi không có ý định ra lệnh, chỉ để cải thiện mọi thứ. Xin vui lòng trả lời trong chuỗi coreutils tạilists.gnu.org/archive/html/ coreutils/ 2016-02/msg00000.html (BTW theo cách này, có một đề xuất mang tính xây dựng để cải thiện một trong những nhược điểm thẩm mỹ được đề cập ở đó, bằng cách thêm một khoảng trắng để cải thiện sự liên kết)
Pádraig Brady

31
@ PádraigBrady Cập nhật câu trả lời. Tuy nhiên, nhìn thấy vô số từ chối trong chủ đề coreutils của bạn. Điểm mấu chốt là bạn đang tạo ra nhiều công việc hơn cho mọi người và bạn đang thực hiện nó dưới tên một HĐH là bản sao của HĐH từ năm 1970. Nếu mọi người muốn một cái gì đó khác biệt, họ sẽ chọn tham gia.
Jan Kyu Peblik

43
@ PádraigBrady Sự thay đổi này đã gây cho tôi sự khó chịu và lãng phí vài giờ cố gắng tìm ra nguyên nhân và giải pháp. Tôi không có ý phủ định - Tôi chỉ chia sẻ quan điểm của người khác! Sửa đổi hành vi cốt lõi có ý nghĩa rất lớn ..
mafrosis

52
Là một người đã sử dụng các hệ thống * nix trong 30 năm, tôi thấy những thay đổi vô cớ như thế này khá khó chịu. Họ phá vỡ các kịch bản lâu đời, vì một điều. Họ cũng vi phạm Nguyên tắc tối thiểu ngạc nhiên. "Chọn tham gia" phải là mặc định ở đây, như đã lưu ý ở trên.
Brian Clapper

28
@ PádraigBrady Đó không phải là cách để thúc đẩy những thay đổi như vậy. Nó muốn đã cách mang tính xây dựng hơn để có hành vi opt-in thay vì hoạt động theo mặc định. Nó cũng gợi ý sai lệch đây là cách lưu trữ tên tệp, nói ngắn gọn với lsnhững gì bạn thấy không còn là cách lưu trữ. Tính năng đó nên là tùy chọn, không phải mặc định.

91

Bạn có thể chọn kiểu trích dẫn :

ls --quoting-style=literal

Giống như:

ls -N

hoặc là:

QUOTING_STYLE=literal ls

Biến nó thành bí danh hoặc đặt export QUOTING_STYLE=literaltrong .bashrchành vi của bạn để đạt được hành vi trước 8,25.


11
Có vẻ hơi kỳ lạ tôi phải làm điều đó để có được hành vi unix-y bình thường. Ngoài ra, tôi muốn mặc định cũ. Tôi không nghĩ thoát là mặc định cũ - tôi nghĩ nó được in chính xác những gì thực sự ở đó.
Wyatt8740

9
Đối với hành vi trước 8,25, sử dụng export QUOTING_STYLE=literaltrong bashrc của bạn.
Lekensteyn

2
hoặc sử dụng -N, có vẻ như. Tôi chỉ biên dịch phiên bản của riêng mình vì tôi đã có một kho lưu trữ cá nhân.
Wyatt8740

2
@LSpice Tôi đã chỉnh sửa bài đăng để sử dụng literalthay vì escape(Tôi tin rằng @cuonglm chỉ muốn hiển thị cách thay đổi kiểu, không đặc biệt nhắm mục tiêu escapekiểu).
Lekensteyn

5
Câu trả lời này xứng đáng được nâng cao hơn. Nó thẳng thắn giải quyết những gì người hỏi yêu cầu tránh một câu trả lời quan liêu. Thật vậy, cách tiếp cận biến môi trường có vẻ khá thanh lịch. (Cá nhân tôi thích hành vi mới vì nó ủng hộ hành động C & P hiệu quả hơn), tuy nhiên, ls đủ thông minh để hành xử theo cách cũ khi sử dụng chuyển hướng, do đó không gây hại cho các tập lệnh sử dụng đầu ra của ls.
Marcelo

42

Một vài điểm về sự thay đổi.

  • Nó được giới thiệu trong coreutils v8.25 và sự liên kết được cải thiện trong v8.26
  • Nó chỉ xảy ra khi xuất ra thiết bị đầu cuối nên không phá vỡ tập lệnh
  • Nó định hướng đầu ra cho người dùng cho các tệp chứa khoảng trắng
  • Nó vệ sinh đầu ra để an toàn để sao chép và dán
  • Đầu ra bây giờ luôn hợp lệ để sao chép và dán lại vào shell
  • Người dùng có thể quay lại định dạng cũ bằng cách thêm -N vào bí danh ls của họ

7
ví dụ cuối cùng của tôi không mơ hồ? Có lẽ không - nhưng chắc chắn là khó hiểu và mất nhiều thời gian hơn để giải mã. Tôi nghĩ đó là một sự thay đổi khủng khiếp (không có ý xúc phạm đối với bạn). Cảm ơn các mẹo bí danh mặc dù.
Wyatt8740

27
Lưu ý: thay đổi này đã được giới thiệu trong coreutils 8.25 ( cam kết , được tác giả bởi cùng một Pádraig như bài đăng này). Cá nhân tôi nghĩ rằng hành vi này là tối ưu, nó phá vỡ sự liên kết bất cứ khi nào một không gian xảy ra trong một tên tệp.
Lekensteyn

10
lời xin lỗi của tôi - rõ ràng là bạn đang trích dẫn một cách an toàn các trích dẫn shell ít nhất. tôi vẫn không thích nó các tùy chọn đều ổn - nhưng thay đổi hành vi mặc định được chỉ định rất rõ của tiện ích lõi unix đã tồn tại hàng thập kỷ theo cách làm giảm tính xác thực của nó chỉ có thể là một ý tưởng tồi .
mikeerv

12
@ PádraigBrady Vì vậy, bạn sẽ tiếp tục lsbị phá vỡ? Nhìn vào tất cả những lập luận chống lại sự thay đổi của bạn. Không ai muốn nó. Có lẽ đã đến lúc phải xin lỗi thế giới và hoàn tác nó.
Chris Warrick

6
@ PádraigBrady Vì vậy, mặc dù nhiều người đã giải thích điều này sai, hỏng, v.v., bạn vẫn sẽ không hoàn nguyên điều này để mặc định không thay đổi? Trái với niềm tin của bạn, sự thay đổi này gây nhầm lẫn không phân tán. Đề nghị mọi người đặt một biến môi trường hoặc bí danh là tốt nhất.
Đánh dấu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.