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을 추가하여 이전 형식을 복원할 수 있습니다.