ifile=~/test.ogv
echo '# Determine input WxH and FPS'
eval "$(ffmpeg -i "$ifile" 2>&1 |sed -nr 's/.*Stream.*Video.* ([0-9]+x[0-9]+),.*[^[0-9.]([0-9.]+).*tbr,.*/WxH=\1;FPS=\2/p')"
echo '# Output multiple images from the input video'
ffmpeg -i "$ifile" -r $FPS -s $WxH -f image2 -vframes 100 -y ~/test-%03d.jpg 2>/dev/null
echo '# use ImageMagic "convert" to generate the animated .gif'
convert -delay 20 ~/test-[0-9][0-9][0-9].jpg ~/test.gif
echo '# remove temp image files'
rm -f ~/test-[0-9][0-9][0-9].jpg
echo 'Done!'
Главным образом семантика. В то время как объединение Ваших командных строк в переменные полезно для сценариев целей, это не хорошо для искажения. Одной видимой причиной является завершение - в то время как различные сценарии завершения, как bash_completion
смогший для контакта с псевдонимами (который печально никогда, оказывалось, не был моим случаем) заставляя их предположить то, что переменные являются растяжимыми к командам, могло сделать его так или иначе грязным.
Вторая причина alias
позволяет Вам делать быстрые клавиши, не используя волшебной команды, ни символа как $
выполнять их. Таким образом, замена прозрачна, и она позволяет переопределять настройки по умолчанию для некоторых программ. Один хороший пример ls
, который часто искажается как ls --color=auto
по умолчанию. Пользователи не должны знать что видеть цветной вывод. Некоторый псевдоним дистрибутивов rm
и связанные команды как rm -i
, таким образом, они работают в интерактивном режиме и могут предотвратить случайные удаления.
Переменные, с другой стороны, могут быть полезны для некоторого использования, которое не требует двоичных файлов имитации. Широкий и хороший пример EDITOR
переменная окружения. Это позволяет не только выполнить Вашего любимого редактора, использующего $EDITOR
, но также и делает другие программы (который не может иметь доступа к оболочке) способный выполнить его, беря это - значение от их среды выполнения.
Могли бы быть некоторые другие вещи, о которых я не знаю, но результатом является то же: те команды должны использоваться, поскольку они предназначаются.
Псевдонимы не должны использоваться в сценариях (отключенный по умолчанию в неинтерактивных оболочках. Можно даже объединить несколько псевдонимов (как несколько строк для оценки). Но псевдонимы не дают Вам хороший уровень абстракции, который Вы получаете от командной строки, проанализированной дважды:
text1=foo; text2=bar; text3=fubar
for((i=1;i<4;i++)); do
eval echo \$text${i}
done
Я признаю, что это могло быть сделано без оценки (varname=text${i}; echo ${!varname}
). Но при построении команд я всегда использовал бы оценку.
shell-expand-line (M-C-e) не работает ни с одним без ошибок.:-)