“file”과“./file”경로 사이에 차이점이 있습니까?


답변:


14

나는 SmallLoanOf1M의 설명에 열중하지 않습니다. 기술적으로 정확하지만 질문의 사용법 예제와 일치하지 않는 방식으로 답변합니다.

예를 들어, "file"과 "./file"이라는 질문과의 차이점이 하나 있습니다.

셸에서 파싱 된 문자로 파일 이름을 지정하면 어떻게됩니까? 특히 명령에 의해 해석되는 문자가 실행 중입니다.

특히 "대시"문자 : "-". 그러나 다른 문자는 쉘에 의미가 있습니다.

예. 내 파일 이름은 "-dingle"입니다

파일을 나열하십시오.

ls -dingle
# ls -dingle
ls: invalid option -- 'e'

더 나쁜 것은 파일 이름이 " -rf rmbomb *"인 경우 어떻게해야 합니까? 이제 제거해보십시오

rm "-rf rmbomb *"

나는 그 예를 실행하려고하지 않을 것이지만, 당신이 아이디어를 얻길 바랍니다.

그렇다면 대시로 시작되는 파일을 어떻게 나열합니까? ./앞에서 사용하십시오 .

# ls ./-dingle
./-dingle

에 대한 Ditto rm


이것이 이상한 이름의 일부 파일을 처리하는 올바른 방법이며 내 대답은 그런 파일을 고려하지 않았습니다. 위의 모든 예제에서 위에 지정된 공백을 포함하여 홀수 문자 앞에 오는 백 슬래시 형식으로 리터럴을 사용할 수도 있습니다. 그 예는 다음 ls \-dingle과 같습니다. 또는 ls \-rf\ rmbomb\ \*. ./이름 앞에 지정된 문자가 뒤에 나오는 문자를 이스케이프하지 않기 때문에 주어진 명령 세트가 최소한 일관성을 유지하는 좋은 방법이 될 수 있습니다 ./.
스풀러

2
이스케이프는 명령이 아닌 쉘에 의해 이스케이프 처리되고 매개 변수는 명령에 의해 구문 분석되어-를 이스케이프 처리하거나 인용하지 않습니다.
Dewi Morgan

2
인쇄 오류를 rm "-rf rmbomb *"만드는 대신 실제로 나쁜 일을하는 것처럼 들립니다 rm. 파일 이름을 인용하는 것을 잊어 버린 경우에만 위험하므로 단어 분리가 발생합니다. ( 예를 들어, rm $file대신 실행하는 셸 스크립트에서 rm "$file". 그러나이 경우 *변수 확장의 내용에서 glob 확장이 발생하지 않으므로 확장되지 않습니다. 원하는 경우 eval. 가 필요합니다 .) 어쨌든, 스크립트가 rm에 전달되기 전에 파일 이름을 쪼개면 파일 space -rf .이나 무언가를 만들 것이므로 rm ./$i도움이되지 않습니다.
Peter Cordes

1
BTW, 실제 오류 메시지는 동일한 인수의 일부이기 때문에 단일 문자 스위치로 rm: invalid option -- ' '공백을 해석하려고 할 때부터 발생합니다 -rf. (그리고 예, 나는 무언가를 간과하고 실제로 위험한 경우를 대비하여 빈 디렉토리에서 이것을 실행했습니다. : P)
Peter Cordes

2
@PeterCordes : wordsplitting 의해 억제 않는 DOES가 인용되지 않은 가변 확장 및 명령 치환의 결과 발생 로빙 IFS=''-f각각. 드문 예는 형식이 awk있는 피연산자 (스크립트 인 첫 번째 피연산자 제외) foo=bar를 실행 할당이지만 ./foo=bar읽을 파일로 처리하는 것입니다.
dave_thompson_085

7

예.

실행하여 file명령 행에서, BASH는 그 이름의 파일을 사용자의 $ PATH 환경 변수를 검색합니다. 파일이 $ PATH 변수 내의 디렉토리에 있지 않으면 찾을 수 없습니다.

.현재 디렉토리를 의미합니다. ./수단 내에서 상대적 측면에서 현재 디렉토리. 디렉토리 에서 작업 /home/sheogorath/shivering/isles.img하는 ./isles.img동안 호출 할 때 와 같은 것을 말하는 것과 같습니다 /home/sheogorath/shivering/.

따라서 일반적으로 "제자리"작업 디렉토리 내에서 파일을 실행하는 데 사용됩니다.

편집 : 귀하의 예 ls에서 쉘에 의해 호출되고 경로 변수를 사용하여 발견됩니다. 인수는 작업 디렉토리에서 처리됩니다. 이것이의 기본값이므로 ls, 현재 디렉토리를 가리키는 지정 file과 명시 적 지정의 차이점은 없습니다 ./file.

모든 명령이 작업 디렉토리에서 파일 경로를 허용하는 것은 아니며 일부는 디렉토리를 통해 구성을 통해 사전 정의 된 파일을 상태로 유지해야합니다. 파일을 인수로 허용하는 명령 중에서이 명령은 덜 일반적입니다


1
즉 bash는하지만, 나는 일반적으로 경로 해상도에 대해 궁금 해서요
세르게이 Alaev

1
이것이 내가 들어 본 모든 쉘의 방식입니다. BASH는 가장 일반적으로 사용됩니다.
스풀러

4
$ PATH는 명령에만 관련 ls이 있으며 원래 질문에서 언급 한 것처럼 명령 뒤에 오는 파일 이름 인수와 관련이 없습니다 . 그것은 상대 경로 (현재 작업 디렉토리에 상대적인) 즉 ../../dir/filename, 절대 경로 를 재 호출하는 것보다 더 큰 차이점입니다./path/to/dir/filename
HBruijn

1
Sheogorath에 +1하고 정답.
Corey Ogburn

1
기본적으로 작업 디렉토리에서 파일을 찾으려고하는 명령에 대한 인수 인 경우 동일합니다. 따라서 ls그것들은 항상 같은 경로 일 것입니다. 하나는 다른 것보다 더 명확하게 지정되어 있습니다. 인수를 처리 할 때 모든 명령이 이러한 방식으로 작동하는 것은 아니지만 대부분의 경우 동작합니다.
스풀러
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.