왜 'ls'가 공백이있는 항목을 작은 따옴표로 묶는 이유는 무엇입니까?


187

ls공백이있는 파일 이름을 입력 할 때마다 내 컴퓨터 중 하나 (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를 자동으로 컬러 출력으로 설정했습니다. 그것은 결코 주변에 따옴표를 넣지 않았습니다.

나는 실행 중이며 bashcoreutils 8.25입니다.

편집 : 개발자가 생각한 핵심 유틸리티 (link)가 나타납니다 .46 년 이상의 유닉스 전통과 놀랍게도 최소한의 원칙을 어기 에도 불구하고 글로벌 기본값을 만드는 것이 좋습니다 .

다시 컴파일하지 않고이 문제를 해결할 수있는 방법이 있습니까?


업데이트-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터미널 을 사용 하는 경우 열 을 사용하고 그렇지 않으면 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
}

20
또 다른 이유는 ls명령을 파싱하지 않는 이유 입니다.
jimmij

12
이상하게 보이지만 터미널로 인쇄 할 때만 활성화되면 의미가 있습니다. 'test'파일이 아닌 'test 1.txt'파일과 다른 '1.txt'파일이 있음을 분명히 알 수 있습니다. ls | cat그것이 사라지는 지 보십시오 . 타임머신이 있다면 Bell Labs ~ 1970으로 돌아가서 Ken Thompson에게 파일과 디렉토리 이름에 공백을 허용하는 것은 나쁜 생각이라고 설득하려고합니다. :-P
Bjorn Munch

6
내가 이것을 처음 보았을 때, 나는 내 스크립트 중 하나가 잘못되어 모든 파일의 이름을로 바꾸 었다고 생각하면서 놀랐다 '*'. 나는 ls그것을 제거하기 위해 모든 기계에 별칭을 추가하는 주위에 갈 것 같아요 ...
제한된 속죄

14
Lekensteyn이 지적한 @LimitedAtonementQUOTING_STYLE=literal 는 별칭이 아닌 환경 변수 로이 작업을 수행 할 수 있습니다 . (나는 그것이 맛의 문제라고 생각하지만 변수를 선호합니다.)
LSpice

4
@BjornMunch는 하나의 파일인지 또는 두 개의 파일인지를 알려주는 두 가지 해결책이 있습니다 .1) 열이 그려지는 방법을 찾으십시오. 2) 라인 당 하나의 항목을 나열하십시오. 둘 다 작은 따옴표로 맹 글링하는 것보다 낫고 명확 해 보입니다.
Wyatt8740

답변:


132

서문 : 이와 같은 답변을 공표하고 하루에 전화하는 것은 상당히 만족 스럽지만 GNU 개발자는 SO 답변 투표에 관심이 없으며 실제로 변경 하도록 장려하고 싶다면 반드시 변경 해야합니다. 이 답변에 설명 된대로 이메일을 보내십시오 .


" 왜 이런 일이 발생합니까? "

몇몇 핵심 유틸리티 개발자들은 수십 년의 사실상의 표준보다 더 잘 알고 있다고 결정했습니다.


" 제대로 중지하려면 어떻게합니까? "

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

버그 리포트

Coreutils에서 버그를 발견했다고 생각되면 가능한 한 완전한 버그 보고서를 <bug-coreutils@gnu.org>로 보내면 Coreutils 버그 추적기에 자동으로 입력됩니다. 버그를보고하기 전에 FAQ를 읽으십시오. 버그 보고서를 작성하고 좋은 질문을하는 방법에 대한 매우 유용하고 자주 참조되는 안내서는 문서를 스마트하게 질문하는 방법 문서입니다. 이전 게시물을 찾아보고 bug-coreutils 아카이브를 검색 할 수 있습니다.

 이 변경 사항 을 이미 되 돌린 배포판 :

영향을받지 않는 배포판 :

  • openSUSE (이미 사용 된 -N)

" 다시 컴파일하지 않고이 문제를 해결할 방법이 있습니까? "

지지자들은 당신을 ...

ls 별칭에 -N을 추가하여 이전 형식으로 되 돌리십시오.

… 나머지 영원의 모든 곳에서 모든 시설에.


17
이 변경은 메일 링리스트에서 제안되었고 3 개의 핵심 유틸리티 관리자가 순 이익이되도록 합의했습니다. 우리는 이것에 대한 건설적인 주장에 전적으로 열려 있습니다. 이것은 결국 오픈 소스이며, 우리는 지시하고, 개선하기 위해서만 의미하지 않습니다. list.gnu.org/archive/html/coreutils/2016-02/msg00000.html 의 coreutils 스레드에서 자유롭게 응답하십시오 . 정렬을 개선하기 위해 공간을 추가하여)
Pádraig Brady

31
@ PádraigBrady 업데이트 된 답변입니다. 그래도 coreutils 스레드에서 많은 거부가 발생합니다. 결론은 사람들을 위해 더 많은 작업을 만들고 있으며 1970 년부터 OS의 복제 본인 OS의 이름으로 작업을 수행한다는 것입니다. 사람들이 다른 것을 원하면 선택합니다.
Jan Kyu Peblik

43
@ PádraigBrady이 변경으로 인해 성가 시게되었고 원인과 해결책을 찾기 위해 몇 시간을 낭비했습니다. 나는 부정적인 것을 의미하지 않습니다-나는 단지 다른 사람들의 관점을 공유하고 있습니다! 핵심 행동을 수정하는 것은 큰 영향을 미칩니다 ..
mafrosis

52
* nix 시스템을 30 년 동안 사용해온 사람으로서, 나는 이와 같은 무질서한 변화가 상당히 성가신 것을 발견합니다. 그것들은 오래된 스크립트를 깨뜨립니다. 그들은 또한 최소 놀랍게도의 원칙을 위반합니다. 위에서 언급 한 것처럼 "Opt-in"이 기본값이었습니다.
브라이언 클래퍼

28
@ PádraigBrady 그것은 여전히 ​​그런 변화를 추진할 수있는 방법이 아닙니다. 되었을 것입니다 방법 이 행동 옵트 인 대신 활성의 기본적를 더 건설. 또한 이것이 파일 이름이 저장되는 방식이며, ls더 이상 보이지 않는 것이 저장되는 방식이라는 잘못된 힌트를줍니다 . 이 기능 기본값이 아닌 선택 사항 이어야 합니다 .

91

인용 스타일을 선택할 수 있습니다 .

ls --quoting-style=literal

다음과 같습니다 :

ls -N

또는:

QUOTING_STYLE=literal ls

별명으로 설정하거나 8.25 이전의 동작을 달성하도록 설정 export QUOTING_STYLE=literal하십시오 .bashrc.


11
정상적인 유닉스 동작을 얻으려면 약간 이상하게 보입니다. 또한 이전 기본값을 원합니다. 나는 탈출이 오래된 기본값이라고 생각하지 않습니다-실제로 그것이 실제로 인쇄 된 것으로 생각합니다.
Wyatt8740

9
8.25 이전의 동작을 위해서는 export QUOTING_STYLE=literalbashrc에서 사용 하십시오.
Lekensteyn

2
또는 사용 -N하는 것 같습니다. 이미 개인 저장소가 설정되어 있으므로 내 버전을 컴파일하고 있습니다.
Wyatt8740

2
@LSpice literal대신 게시물을 편집했습니다 escape(@cuonglm은 스타일을 구체적으로 대상으로하지 않고 스타일을 변경하는 방법을 보여주고 싶었습니다 escape).
Lekensteyn

5
이 답변은 더 많은 투표를 받아야합니다. 그것은 관료적 답변을 피하면서 질문자가 요구 한 내용을 바로 다룬다. 실제로 환경 변수 접근 방식은 매우 우아해 보입니다. (나는 개인적으로 새로운 행동이 더 효율적인 C & P 행동을 선호하기 때문에 선호한다), 그러나 ls는 방향 전환이 사용될 때 구식으로 행동하기에 충분히 영리하므로 ls의 출력을 사용하는 스크립트에는 해를 끼치 지 않는다.
Marcelo

42

변경에 대한 몇 가지 사항.

  • coreutils v8.25에서 도입되었으며 v8.26에서 정렬이 향상되었습니다.
  • 터미널로 출력 할 때만 발생하므로 스크립트를 중단하지 않습니다.
  • 공백이 포함 된 파일의 사용자 출력을 명확하게합니다.
  • 출력을 소독 하여 복사하여 붙여 넣기 가 안전 합니다.
  • 출력은 항상 셸에 복사하여 다시 붙여 넣을 때 항상 유효 합니다.
  • 사용자는 ls 별칭에 -N을 추가하여 이전 형식으로 되돌릴 수 있습니다.

7
내 마지막 예가 모호하지 않습니까? 아마도 아닙니다-그러나 혼란스럽고 해독하는 데 더 많은 시간이 걸립니다. 나는 이것이 끔찍한 변화라고 생각합니다. 별명 팁에 감사드립니다.
Wyatt8740

27
참고 :이 변경 사항은 coreutils 8.25에서 도입되었습니다 ( commit ,이 게시물과 동일한 Pádraig가 작성). 개인적으로 나는이 동작이 차선책이라고 생각합니다. 파일 이름에 공백이 생길 때마다 정렬이 깨집니다.
Lekensteyn

10
내 사과-분명히 당신은 적어도 쉘 인용을 안전하게 인용합니다. 나는 아직도 그것을 좋아하지 않는다. 옵션은 훌륭하지만 수십 년 된 유닉스 코어 유틸리티의 매우 기본 동작을 변경하여 그 진실성을 감소시키는 것은 나쁜 생각 일 수 있습니다.
mikeserv

12
@ PádraigBrady 그래서, 당신은 계속 ls깨진거야? 당신의 변화에 ​​반대하는 모든 주장을보십시오. 아무도 그것을 원하지 않습니다. 아마도 세상에 사과하고 실행을 취소해야 할 때입니다.
크리스 워릭

6
@ PádraigBrady 그래서 이것이 잘못되거나 깨지는 방법을 설명 한 많은 사람들이 있음에도 불구하고 여전히 기본값을 변경하지 않기 위해 이것을 되 돌리지 않을 것입니까? 당신의 믿음과는 달리,이 변화는 모호 하지 않습니다 . 사람들이 환경 변수 또는 별칭을 설정하도록 제안하는 것은 최선의 방법입니다.
Mark
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.