왜 ‘ls’가 공백이있는 항목을 작은 따옴표로 묶는 이유는 무엇입니까? 중 하나 (Debian

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
}



답변

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


왜 이런 일이 발생합니까?

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


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

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

버그 리포트

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

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

영향을받지 않는 배포판 :

  • openSUSE (이미 사용 된 -N)

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

지지자들은 당신을 …

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

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


답변

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

ls --quoting-style=literal

다음과 같습니다 :

ls -N

또는:

QUOTING_STYLE=literal ls

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


답변

변경에 대한 몇 가지 사항.

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

답변