"ls"가 갑자기 공백을 작은따옴표로 묶는 이유는 무엇입니까?

"ls"가 갑자기 공백을 작은따옴표로 묶는 이유는 무엇입니까?

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를 자동 색상 출력으로 직접 설정했습니다. 이전에는 사물에 대한 인용문이 없었습니다.

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

나는 이것이 수정되었다고 생각했지만, 분명히 "안정적인" 데비안 브랜치가 새 릴리스에서 다른 수정 사항 등을 가져오는 동안 "기능 동결"을 유지할 수 있도록 되돌린 것 같습니다. 그래서 (제 생각에는) 부끄러운 일입니다.

업데이트: 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
}

답변1

머리말: 이와 같은 답변에 투표하고 끝내는 것은 매우 만족스러울 수 있지만 GNU coreutils 관리자는 SO 답변 투표에 관심이 없으며 안심하십시오.당신이 정말로 원한다면그들을 격려하다변화, 당신은해야그들에게 이메일을 보내이 답변에 설명되어 있습니다.


2019 업데이트:
작년에 관리자들은 노력을 두 배로 늘려 이제는 누구나 사용할 수 있게 되었습니다.[이메일 보호됨]이 문제에 대한 보고서는 다음을 가리키는 상용구 응답일 뿐입니다.그들은 웹사이트에 이 변경으로 인해 사람들이 겪고 있는 문제를 나열하는 매우 긴 페이지를 가지고 있는데, 그들은 이를 무시하는 데 전념하고 있습니다..
지속적인 압력으로[이메일 보호됨]보고서는 이 거대하고 터무니없는 페이지를 생성하도록 강요하고 아마도 이 문제에 대해 기꺼이 작업하려는 관리자의 수를 단 한 명으로 줄이는 영향을 미쳤습니다.
너무 많은 사람들이 무언가가 버그라고 생각하면 관리자의 동의 여부는 버그입니다.
계속하다그들에게 이메일을 보내변화를 장려하는 가장 쉬운 방법입니다.


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

일부 coreutils 유지관리자는 수십 년 동안 있었던 사실상의 표준보다 더 잘 알고 있다고 생각합니다.


"어떻게 하면 제대로 예방할 수 있나요?"

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

오류 보고서

Coreutils에서 버그를 발견했다고 생각되면 가능한 한 완전한 버그 보고서를 다음 주소로 보내주십시오.<[이메일 보호됨]>, Coreutils 버그 추적기에 자동으로 입력됩니다. 버그를 신고하기 전에 FAQ를 읽어보세요. 버그 보고서를 작성하고 좋은 질문을 하는 방법에 대한 매우 유용하고 자주 인용되는 가이드는 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을 추가하여 이전 형식을 복원할 수 있습니다.

관련 정보