/bin
내 디렉토리에 다음 줄이 포함된 쉘 스크립트가 있습니다 play applause.mp3
. 이 파일은 applause.mp3
실행 파일과 동일한 디렉터리에 있습니다.
그러나 play 명령으로 인해 오류가 발생했습니다 play FAIL formats: can't open input file 'applause.mp3': No such file or directory
.
디렉토리에서 파일을 직접 열면 잘 재생됩니다 /bin
. 파일이 디렉터리가 아닌 다른 곳에 .mp3
있어야 한다는 것은 분명합니다 . /bin
Bash는 파일을 어디에서 찾나요?
답변1
PATH
Bash는 환경 변수로 지정된 디렉터리에서 실행할 명령을 찾습니다 .
그러나 귀하의 시나리오에서는 bash가 이미 작업을 수행하고 play
명령을 실행했습니다. applause.mp3
매개변수로 전달됩니다. 그것은 모두 play
명령이 그것을 어떻게 해석하는지에 달려 있습니다.
명령이 파일 이름 인수를 사용하는 일반적인 경우에는 현재 디렉터리에서 시작하는 경로를 확인합니다(이것이 /bin
스크립트를 호출하기 전에 디렉터리를 로 변경할 때 작동하는 이유입니다).
/
문제를 방지하려면 매개변수에 절대 경로(다음으로 시작)를 사용해야 합니다.
답변2
프로그램은 실행 파일과 동일한 디렉터리에서 사용자 데이터 파일을 찾지 않습니다. 때때로 동일한 디렉터리에서 구성 파일이나 정적 데이터 파일을 찾습니다(그러나 이는 드문 경우입니다). 그러나 사용자 데이터와 설치된 프로그램이 동일한 디렉토리에 있는 경우는 거의 없습니다. 프로그램은 일반적으로 사용자가 쓸 수 없는 시스템 디렉토리에 있고 사용자의 파일은 일반적으로 홈 디렉토리에 있습니다.
파일 이름을 프로그램에 전달하면 다음과 같이 해석됩니다.현재 작업 디렉토리. 모든 프로세스에는 프로세스 환경의 일부이며 특정 프로그램과 연결되지 않은 현재 작업 디렉터리가 있습니다. 일반적으로 홈 디렉토리에서 시작되며 쉘 명령을 사용하여 cd
다른 디렉토리로 변경할 수 있습니다. 쉘에서 시작된 모든 프로그램은 쉘의 현재 디렉토리를 상속받습니다.
실행하면 현재 디렉터리에서 호출된 파일을 play applause.mp3
찾습니다 . applause.mp3
실행 파일이 어떤 디렉터리에 있는지는 중요하지 않습니다 play
.
현재 디렉토리에 관계없이 유효한 파일 이름을 사용하려면 다음을 전달하십시오.절대 파일 이름(로 시작 /
). 쉘 스크립트나 명령줄에서는 ~
시작 부분에 약어를 사용하여 홈 디렉터리를 나타낼 수 있습니다. 예를 들어 홈 디렉터리의 하위 디렉터리에 있는 파일에서 실행합니다 play ~/music/applause.mp3
.play
applause.mp3
music
1 가능하지만 거의 그렇지 않습니다.