Проблема в том, что вы выполняете другую ветвь в подоболочке (, что означает скобки -, например. на справочной странице bash(1)
найдите compound commands
)-, поэтому exit
выходит из подоболочки, а не из оболочки, выполняющей скрипт. Чтобы увидеть это более графически, поместите достаточно длинный sleep
в обе версии вашего кода и запуститеps faux
(для coreutils
версииps
)или что-то вроде pstree
, чтобы увидеть отношения предков процесса.
Теперь, как это "исправить":
в if... then / else / fi
нет ничего плохого. Особенно для более длинных блоков это делает код более читаемым.
если вы хотите один лайнер, то вы можете сделать
[ "$?" -eq 0 ] && echo "OK" || echo "NOK" >&2 && exit 1
, который полагается на корректное завершение эха, или используйте групповую команду
[ "$?" -eq 0 ] && echo "OK" || { echo "NOK" >&2 ; exit 1; }
Проверьте общедоступность в вашей оболочке и любые особенности, хотя -например. он должен заканчиваться новой строкой или точкой с запятой.
наиболее полный -пример использования обработчика сигнала/события(bash
синтаксис для других оболочек может отличаться):
#!/bin/bash
exit_handler () {
echo "error happened, exiting"
... fix things, that may be half baked...
}
trap exit_handler EXIT
... do stuff...
Это дает вам возможность:
set -e
(set -o errexit
), которое часто считается опасным -обработчик EXIT
может делать такие вещи, как удаление любых временных файлов, которые вы не хотите оставлять kill
)а также Это удалит первые 8 секунд из начала файла без повторного -кодирования и сохранит все, кроме первых 8 секунд, в выходном файле
ffmpeg -ss 8 -i in_file.m4a -c copy out_file.m4a
Кроме того, в строке ниже будут обрезаны последние 8 секунд с конца аудиофайла. Строка ниже кажется запутанной, но это самое простое решение, которое я мог видеть, которое обрезает конец файла:
ffmpeg -i in_file.m4a -ss 8 -i in_file.m4a -c copy -map 1:0 -map 0 -shortest -f nut - | ffmpeg -y -f nut -i - -map 0 -map -0:0 -c copy out_file.m4a
Как и ffmpeg, вы также можете использовать SoX, который больше предназначен для аудио, но вам сначала нужно будет преобразовать аудиофайл в wav или mp3, я думаю, поскольку SoX не работает с m4a.
ffmpeg -i input.m4a output.wav
После установки SoX
sudo apt-get install sox
sox input.wav output.wav trim 8 -8
Похоже на то, что если вы просто хотите удалить тихие части, вы также можете использовать для этого Librosa.
Для использования формата m4a с Librosa вам необходимо установить ffmpeg и GStreamer, например, на Debian/Ubuntu:
sudo apt install libgstreamer1.0-0
sudo apt install ffmpeg
Тогда в питоне вы можете использовать:
import librosa
y, sr = librosa.core.load(m4a_audio_file, sr=16000)
yt, index = librosa.effects.trim(y)
original_duration= librosa.get_duration(y)
new_duration = librosa.get_duration(yt)