외부에서 호출 할 때 스크립트가 작동하지 않습니다


8

간단한 스크립트를 사용하여 .mp4 파일에서 .mp3를 만듭니다.

#!/bin/bash
for i in *.mp4
do
ffmpeg -i "$i" -ab 128k "${i%mp4}mp3"
done

스크립트는 데스크탑에서 실행되거나 터미널을 통해 호출 될 때 정상적으로 실행됩니다. 그러나 스크립트가 외부 스크립트에서 호출되면 실행에 실패하고

"* .mp4 : 해당 파일 또는 디렉토리 없음".

문제는 쉘 확장에 문제가 있다고 생각하지만이 상황에서 문제를 해결하는 방법에 대해 머리를 감쌀 수는 없습니다.

답변:


13

스크립트가 .mp4현재 디렉토리에서 파일, 즉 스크립트가 실행되고있는 디렉토리를 찾고 상대 파일을 찾지 않는 상대 경로를 사용하는 .mp4경우 리터럴 *.mp4파일을 찾습니다 ( nullglob/ failglob가 아닌 것으로 가정) 이 파일이 존재하지 않기 때문에 오류 메시지가 표시 *.mp4: No Such File or Directory됩니다.

대신 절대 경로를 사용해야합니다.

for i in /directory/*.mp4; do ...; done

교체 /directory/실제 디렉토리 경로와; 원하는 경우 디렉토리 이름을 첫 번째 인수로 사용할 수도 있습니다.

for i in "$1"/*.mp4; do ...; done

여기서 절대 또는 상대 경로를 사용할 수 있지만 절대 경로는 항상 더 안전한 옵션입니다.

이제 일반적인 방식으로 실행 스크립트를 호출하십시오.

/path/to/script.sh /directory

스크립트 디렉토리에서 :

./script.sh /directory

도와 주셔서 감사합니다. 내가 이미 그 시도에 실패했다고 말하려고했지만 처음에 "/ home"에서 "H"를 대문자로 한 것을 알았습니다. 인수로 경로를 전달하는 것이 특히 유용했습니다. 건배.
M. Street

"따라서 오류 메시지"는 실제로 다음을 의미합니다. 셸이 *.mp4어떤 파일 과도 일치 할 수 없으므로 파일을 리터럴 파일 이름으로 간주하고 파일 *.mp4(유효한 파일 이름) 인 파일을 열려고하지만 파일 이 없기 때문에 실패합니다 *.mp4현재 디렉토리에서 호출 됩니다. 누군가 *.mp4일치하는 파일 이름 목록으로 항상 확장 한다고 생각할 수 있습니다.이 파일은 비어있을 수 있습니다 (이 경우 for루프는 아무것도하지 않지만 오류는 발생하지 않습니다). 그렇지 않습니다. *.mp4항상 무언가로 확장됩니다.
Bakuriu

@Bakuriu 반면에이 경우 (또는 기본값은 bash)이지만 항상 그런 것은 아닙니다. 보고 nullglob/ failglob.
heemayl

내가 잘못했다면 '*'는 경로와 파일 이름의 조합이 아니라 파일 이름만을위한 것이라고 생각했습니다. 살고 배우기 :)
M. Street
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.