2015-08-19 81 views
0

我正在使用OS X Yosemite。我想製作一個簡單的bash腳本,允許我對視頻進行轉碼。只要文件不在具有空格的目錄中,一切都可以正常工作。ffmpeg bash腳本中的空格文件名變量

這裏是我的腳本:

#!/bin/sh 

ffmpeg -i 「$1」 -c:v ffv1 -level 3 -g 1 -c:a copy 「$1.mkv」 

起初,我沒有周圍的變量雙引號,但我看書上說用這樣的一種解決方案的一些堆棧溢出。我寧願沒有改變路徑或加斜槓等等。我想只要運行:

./script.sh filename.mov 

這是我得到的錯誤:

Kierans-iMac:~ bla$ ./firstscript.command "/Users/bla/Desktop/untitled\ folder\ 2/v210.mov.mkv" 
ffmpeg version 2.7.2 Copyright (c) 2000-2015 the FFmpeg developers 
    built with Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) 
    configuration: --prefix=/usr/local/Cellar/ffmpeg/2.7.2_1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-libfreetype --enable-libfaac --enable-libass --enable-ffplay --enable-libopenjpeg --disable-decoder=jpeg2000 --extra-cflags='-I/usr/local/Cellar/openjpeg/1.5.2_1/include/openjpeg-1.5 ' --enable-nonfree --enable-vda 
    libavutil  54. 27.100/54. 27.100 
    libavcodec  56. 41.100/56. 41.100 
    libavformat 56. 36.100/56. 36.100 
    libavdevice 56. 4.100/56. 4.100 
    libavfilter  5. 16.101/5. 16.101 
    libavresample 2. 1. 0/2. 1. 0 
    libswscale  3. 1.101/3. 1.101 
    libswresample 1. 2.100/1. 2.100 
    libpostproc 53. 3.100/53. 3.100 
「/Users/bla/Desktop/untitled\: No such file or directory 
+0

你的實際cmd是'./firstscript.command「/ Users/bla/Desktop/untitled \ folder \ 2/v210.mov.mkv」'。路徑是一條路徑,無論是「cd」到目錄並從那裏執行,還是必須在命令中傳遞完整路徑或相對路徑。正如你已經dbl引用你的路徑,嘗試刪除2''\''字符轉義空間。或者從使用unix派生系統中消除一整類錯誤,並且不要在目錄或文件名中使用空格; - !祝你好運。 – shellter

+0

您是否正在使用正確的ASCII雙引號或此問題中顯示的捲曲引號? – chepner

+0

感謝您的回覆!我只是用script.sh作爲一個通用的例子。我從路徑中刪除了雙引號,所以現在它是./firstscript.command/Users/bla/Desktop/untitled \ folder \ 2/v210.mov.mkv,但它是相同的錯誤。 –

回答

2

你引用的空間兩次:

./firstscript.command "/Users/bla/Desktop/untitled\ folder\ 2/v210.mov.mkv" 

應該只是

./firstscript.command "/Users/bla/Desktop/untitled folder 2/v210.mov.mkv" 

帶引號的字符串"foo"相當於\f\o\o;每個角色都逃脫了。原文中的反斜槓被視爲文字反斜槓。

在腳本中,你仍然需要引用參數擴展:

ffmpeg -i "$1" -c:v ffv1 -level 3 -g 1 -c:a copy "$1.mkv" 

請注意,您必須使用普通的ASCII引號("),而不是「智能」引號()由錯誤暗示消息在你的鏈接。

+0

謝謝!我的腳本確實有這些巧妙的引語。當我啓用ascii引號時,腳本起作用了!實際上,我甚至不需要在終端附近引用命令。希望我不需要,因爲它看起來工作得很好,沒有引號? –

+1

正確; ''foo bar「'和'foo \ bar'是shell執行引號移除後的相同字符串 – chepner