다음 디렉터리와 파일을 갖는 것을 고려해보세요.
$ tree /tmp/test
/tmp/test
├── dir
│ ├── file_normal
│ ├── file with "double quote
│ ├── file with 'single quote
│ ├── file with space
│ └── special!char
├── dir with space
│ ├── file_normal
│ ├── file with "double quote
│ ├── file with 'single quote
│ ├── file with space
│ └── special!char
├── file_normal
├── file with "double quote
├── file with 'single quote
├── file with space
└── special!char
ls
작은따옴표 또는 큰따옴표 추가필요할 때만. 따옴표 dir
가 없습니다 file_normal
.
$ ls -1 /tmp/test
dir
'dir with space'
file_normal
'file with "double quote'
"file with 'single quote"
'file with space'
'special!char'
ls
단일 파일에 대해 동일한 작업을 수행합니다.
필요한 경우가 아니면 따옴표를 추가하지 마세요.
$ ls "file_normal"
file_normal
$ ( cd dir ; ls "$( realpath file_normal )" )
/tmp/test/dir/file_normal
필요한 경우에만 따옴표를 추가하세요.
$ ls "file with space"
'file with space'
$ ( cd 'dir with space' ; ls "$( realpath file_normal )" )
'/tmp/test/dir with space/file_normal'
ls
쉘 스크립트에서의 사용을 고려하는 것은 일반적으로 권장되지 않습니다 . 동일한 기능을 구현하는 내장 Linux 프로그램이 있습니까?필요한 경우에만 파일 경로에 작은따옴표나 큰따옴표를 추가하시겠습니까?
답변1
예: ls
. 그냥 사용하세요. 모든 규칙과 마찬가지로 "ls를 사용하지 마십시오"에 대한 의미 있는 예외가 있습니다. 이것은 그들 중 하나입니다. 먼저 이해해야합니다.왜ls
사용을 권장하지 않습니다.
- 이는 간단한 쉘 글로브가 작업을 완벽하게 수행하는 상황에서 사용되며, 쉘이 출력을
ls
구문 분석하지 않고 직접 개별 단어에 대한 경로를 제공하기 때문에 가능한 것보다 더 나은 작업을 수행하는 경우가 많습니다 . (특히 겉으로는 비슷하지만 그렇지 않은 것을ls
볼 때 짜증이 납니다 .)for i in $(ls *.xyz)
for i in *.xyz
- 가변적인 열 크기로 인해
ls -l
추가 정보와 파일 이름을 얻으려고 할 때 구문 분석이 어렵습니다. 사용stat
하거나find
대체하십시오. ls
?
출력에서 특수 문자 처리가 까다로울 수 있습니다(예: 일부 문자가 대체됨).
이 경우:
- 당신은 분명히이미관련 경로가 있으므로
ls
glob을 충분히 얻을 수 있도록 오용하지 마십시오. ls -l
경로 이외의 정보를 사용하거나 얻으려고 하지 않습니다.- 너생각하다
ls
--quoting-style=shell-escape
특별 출력 제공( 구체적으로)
따라서 다음과 같이 사용하십시오.
quoted_path=$(ls -d --quoting-style=shell-escape <some-path>)
그렇지 않다는 점을 꼭 이해해주세요.기준. 최신 버전의 GNU ls는 이를 수행할 수 있지만 busybox ls는 이를 수행하지 않으므로(AFAICT) 모든 Linux 시스템이 이를 지원하는 것은 아닙니다.
당신은 또한 사용할 수 있습니다GNU 통계같은 경우에는 %N
형식 지정자를 사용하세요.
%N
– 심볼릭 링크의 경우 파일 이름은 인용되거나 인용되지 않습니다(아래 참조).
[...] " " 형식은 환경 변수를 사용하여 설정할 수 있습니다
. 이 환경 변수가 설정되지 않은 경우 기본값은 " "입니다.%N
QUOTING_STYLE
shell-escape-always
그래서:
quoted_path=$(QUOTING_STYLE=shell-escape stat -c %N <some-path>)
for에 대한 참조 스타일은 stat
for와 동일한 것 같습니다 ls
(내부적으로 동일한 기능을 사용한다고 장담합니다). 이 경우 주요 차이점은 심볼릭 링크 처리인 것 같습니다. stat
심볼릭 링크를 있는 그대로 처리하려는 경우 이는 아마도 사용하려는 것이 아닐 것입니다.
% QUOTING_STYLE=shell-escape stat -c %N bar$'\n'baz$'\t'xyz
'bar'$'\n''baz'$'\t''xyz' -> 'foo bar'
% ls --quoting-style=shell-escape bar$'\n'baz$'\t'xyz
'bar'$'\n''baz'$'\t''xyz'
다른 옵션:
- Bash 매개변수 확장
Q
따옴표 연산자 사용 :${foo@Q}
변수의 내용을 따옴표로 묶어 인쇄합니다foo
(그러나 항상 따옴표를 추가하는 것처럼 보입니다). - Bash
printf
형식%q
지정자(따옴표보다 백슬래시를 선호하는 것처럼 보이지만 필요하지 않은 경우 이스케이프를 추가하지 않습니다)