私はffmpegを自分でコンパイルして、自分のプログラムと一緒に配布できる小さな実行ファイルを得たいと考えていました。公式のUbuntu 用 ffmpeg コンパイル ガイド実際にffmpegをコンパイルしようとすると、セクションの説明に従ってエラーが発生します。コンパイルとインストール -> FFmpeg次のような長い複合コマンドが与えられます。
cd ~/ffmpeg_sources && \
wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 && \
tar xjvf ffmpeg-snapshot.tar.bz2 && \
cd ffmpeg && \
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
--prefix="$HOME/ffmpeg_build" \
--pkg-config-flags="--static" \
--extra-cflags="-I$HOME/ffmpeg_build/include" \
--extra-ldflags="-L$HOME/ffmpeg_build/lib" \
--extra-libs="-lpthread -lm" \
--ld="g++" \
--bindir="$HOME/bin" \
--enable-gpl \
--enable-gnutls \
--enable-libaom \
--enable-libass \
--enable-libfdk-aac \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libsvtav1 \
--enable-libdav1d \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 \
--enable-nonfree && \
PATH="$HOME/bin:$PATH" make && \
make install && \
hash -r
libvpx エンコーダーのみをインクルードし、ffmpeg はインストールせず、コンパイルのみを行います。これで、少し短いコマンドが残ります。
cd ~/ffmpeg_sources && \
wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 && \
tar xjvf ffmpeg-snapshot.tar.bz2 && \
cd ffmpeg && \
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
--prefix="$HOME/ffmpeg_build" \
--pkg-config-flags="--static" \
--extra-cflags="-I$HOME/ffmpeg_build/include" \
--extra-ldflags="-L$HOME/ffmpeg_build/lib" \
--extra-libs="-lpthread -lm" \
--ld="g++" \
--bindir="$HOME/bin" \
--enable-libvpx \
PATH="$HOME/bin:$PATH" make && \
hash -r
この複合コマンドは6つの個別のコマンドで構成されています。最長の5番目のコマンドを実行すると
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
--prefix="$HOME/ffmpeg_build" \
--pkg-config-flags="--static" \
--extra-cflags="-I$HOME/ffmpeg_build/include" \
--extra-ldflags="-L$HOME/ffmpeg_build/lib" \
--extra-libs="-lpthread -lm" \
--ld="g++" \
--bindir="$HOME/bin" \
--enable-libvpx \
PATH="$HOME/bin:$PATH" make
このエラーが発生します
Unknown option "PATH=/home/joker/bin:/home/joker/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin".
See ./configure --help for available options.
ここで、joker はこの仮想マシン上の私のユーザー名です。
私は最新のアップデートをすべて適用した Ubuntu Groovy Gorilla x64 を使用しています。
何が間違っているのでしょうか?
答え1
事実:
\
改行文字の前に、コマンドが次の行に続くことをシェルに伝えます。foo=bar baz
環境内の変数baz
を使用して実行されます。foo
baz && qux
成功 (終了ステータス ) が返されたqux
場合にのみ実行されます。baz
0
元のコマンドは次のようになります
… && \
PATH=… PKG_CONFIG_PATH=… ./configure \
… \
--enable-nonfree && \
PATH=… make && \
…
同様に
… && PATH=… PKG_CONFIG_PATH=… ./configure … --enable-nonfree && PATH=… make && …
構造はこんな感じです
… && ./configure … && PATH=… make && …
あなたはそれを次のようなものにしました
… && ./configure … PATH=… make && …
がPATH=…
のオプションになりました./configure
。これは間違っています。
つまり、&&
以前から を削除すべきではありませんでした。新しいスニペットは、適切な場所 ( ) にPATH="$HOME/bin:$PATH" make
追加することで修正できます。&&
--enable-libvpx && \
元のコードが次の形式であれば、混乱は少なくなります。
… \
&& PATH=… PKG_CONFIG_PATH=… ./configure \
… \
--enable-nonfree \
&& PATH=… make \
&& …
ここで--enable-nonfree \
行全体を削除すると、必要な&&
before はPATH=… make
残ります。
補足:元のコード内のバックスラッシュの一部は、&& \
行末にあるため冗長です。ただ&&
&&
代わりに次の行の先頭に配置することにした場合、\
現在の行では省略できません。