Linux 프로그램은 필요할 때만 파일 이름을 인용합니까?

Linux 프로그램은 필요할 때만 파일 이름을 인용합니까?

다음 디렉터리와 파일을 갖는 것을 고려해보세요.

$ 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?출력에서 특수 문자 처리가 까다로울 수 있습니다(예: 일부 문자가 대체됨).

이 경우:

  • 당신은 분명히이미관련 경로가 있으므로 lsglob을 충분히 얻을 수 있도록 오용하지 마십시오.
  • 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– 심볼릭 링크의 경우 파일 이름은 인용되거나 인용되지 않습니다(아래 참조).
    [...] " " 형식은 환경 변수를 사용하여 설정할 수 있습니다
    . 이 환경 변수가 설정되지 않은 경우 기본값은 " "입니다.%NQUOTING_STYLEshell-escape-always

그래서:

quoted_path=$(QUOTING_STYLE=shell-escape stat -c %N <some-path>)

for에 대한 참조 스타일은 statfor와 동일한 것 같습니다 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지정자(따옴표보다 백슬래시를 선호하는 것처럼 보이지만 필요하지 않은 경우 이스케이프를 추가하지 않습니다)

관련 정보