Znaczenie #!/bin/sh
To dlatego, że używasz #!/bin/sh
w skrypcie, jako poprawki powinna go zmienić na #!/bin/bash
.
#!/bin/bash
for i in *.mp4
do
ffmpeg -i "$i" "${i/.mp4/.mp3}"
done
Ludzie korzystają #!/bin/sh
przy użyciu jedynie ograniczony zestaw funkcji (zdefiniowaną przez standard POSIX) dla maksymalnej przenośności. #!/bin/bash
jest całkowicie w porządku dla skryptów użytkownika. /bin/sh
jest zwykle dowiązany do minimalnej powłoki zgodnej z POSIX lub do standardowej powłoki (np. Bash). W drugim przypadku bash prowadzony jest w trybie zgodności, co zostało wyjaśnione w manpage:
Jeżeli bash wywoływany jest pod nazwą sh, próbuje naśladować zachowanie startowe historycznych wersji sh tak ściśle, jak to możliwe, jednocześnie zgodny ze standardem POSIX.
Proponowane zmiany w skrypcie:
- Uważa się dobra praktyka, aby korzystać w cudzysłowie zmiennych (
"$i"
zamiast $i
). Zaprotokołowane zmienne zapobiegną problemom, jeśli zapisana nazwa pliku zawiera białe spacje.
- Podoba mi się, że używasz zaawansowanego parameter expansion. Proponuję użyć
"${i%.mp4}.mp3"
(zamiast "${i/.mp4/.mp3}"
), ponieważ tylko zastępuje na końcu (na przykład plik o nazwie foo.mp4.backup
).
Czy używasz skryptu #!/Bin/sh lub #!/Bin/bash? –
W konsoli polecenia zostały wykonane przez powłokę 'bash'. Jeśli używasz '#!/Bin/sh' w swoim skrypcie, to' sh' shell próbuje wykonać, a tym samym błąd. – jitendra
Napisałem #!/Bin/sh w pierwszym wierszu ... – WhatIsName