Projects
Multimedia
ffx264
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 18
View file
ffx264.changes
Changed
@@ -1,4 +1,20 @@ ------------------------------------------------------------------- +Mon Nov 14 09:18:00 UTC 2016 - neutrino8@opensuse.org + +- Update to version 3.1.7 + * Set default amount of subtitles to 1 instead of exiting when no + value is given + * Allow the user to choose the amount of audio tracks he wants at + run time instead of requiring it to be set in the config file. + This removes config file var MAX_AUD_TRACKS and bumps up version + to 27 + * Renamed array variables audmapval and submapval to audindex and + subindex since we're not mapping but specifying the audio/sub + index id with these vars + * Fixed a possible case where audio params weren't cleared in + case the nosound option was chosen + +------------------------------------------------------------------- Sun Nov 13 11:36:00 UTC 2016 - neutrino8@opensuse.org - Update to version 3.1.6
View file
ffx264.spec
Changed
@@ -17,7 +17,7 @@ Name: ffx264 -Version: 3.1.6 +Version: 3.1.7 Release: 0 Summary: A small shell script for encoding to H.264 with ffmpeg License: GPL-2.0+
View file
ffx264-3.1.6.tar.gz/ChangeLog -> ffx264-3.1.7.tar.gz/ChangeLog
Changed
@@ -1,3 +1,17 @@ +2016-11-14 - ffx264 3.1.7 + * Set default amount of subtitles to 1 instead of exiting when no + value is given + * Allow the user to choose the amount of audio tracks he wants at + run time instead of requiring it to be set in the config file. + This removes config file var MAX_AUD_TRACKS and bumps up version + to 27 + * Renamed array variables audmapval and submapval to audindex and + subindex since we're not mapping but specifying the audio/sub + index id with these vars + * Fixed a possible case where audio params weren't cleared in + case the nosound option was chosen + * A few other small tweaks + 2016-11-13 - ffx264 3.1.6 * Added support for batch encoding mode, to be activated with the new -b option. It's used to encode directories with video files
View file
ffx264-3.1.6.tar.gz/ffx264 -> ffx264-3.1.7.tar.gz/ffx264
Changed
@@ -2,8 +2,8 @@ # # Small script to encode to H.264/AVC video using FFmpeg and libx264. # Author: Grozdan "microchip" Nikolov <neutrino8@opensuse.org> -# Version: 3.1.6 -# Date: 2016-11-13 +# Version: 3.1.7 +# Date: 2016-11-14 # # ffx264 is free software ; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -23,10 +23,10 @@ brown() { echo -e "\e0;33m$1\e0;39;49m"; } error() { echo -e "\e1;31m$1\e0;39;49m"; } -version="3.1.6" +version="3.1.7" CFG="$HOME/.ffx264" -cfgversion="26" +cfgversion="27" genconfig_func() { cat<<EOF>>"$CFG" @@ -90,12 +90,6 @@ AUD_VOLUME="y" AUD_RESAMPLE="y" -# Max amount of audio tracks to support -# Any non-zero value will do. Set it -# to "auto" to ask for as many as -# detected audio tracks -MAX_AUD_TRACKS="2" - # Enable subtitles support? # Note: not all containers support # all types of subs! @@ -254,31 +248,11 @@ esac done -if ! -z "$PRSTFILE" ; then - if ! -z "$vpreset" -o ! -z "$vtune" ; then - if ! -z "$(grep '^X264PARAMS' "$PRSTFILE")" ; then - echo - error "-> x264 presets/tune profiles are mutually exclusive with custom presets!" - echo - error "-> If you want to use a custom configuration file, don't add or comment" - error " out the X264PARAMS variable in it. Then you can use the built-in" - error " presets/tuning with that file." - echo - exit 1 - fi - fi -else +if ! -z "$vtune" ; then if -z "$vpreset" ; then - if -f "$CFG" -a -z "$(grep '^X264PARAMS' "$CFG")" ; then - echo - error "-> The X264PARAMS variable is commented out" - error " or missing from '$CFG'" - echo - error "-> Regenerating config file!" - rm -f "$CFG" - genconfig_func - echo - fi + error "-> Tune profiles require a preset to be used!" + error "-> Use: $(basename $0) -h" + exit 1 fi fi @@ -315,7 +289,37 @@ source "$CFG" fi -test ! -z "$PRSTFILE" && source "$PRSTFILE" +if ! -z "$PRSTFILE" ; then + if ! -z "$vpreset" ; then + if ! -z "$(grep '^X264PARAMS' "$PRSTFILE")" ; then + error "-> x264 presets/tune profiles are mutually exclusive with custom presets!" + error "-> If you want to use a custom configuration file, don't add or comment" + error " out the X264PARAMS variable in it. Then you can use the built-in" + error " presets/tuning with that file." + echo + exit 1 + fi + else + if -z "$(grep '^X264PARAMS' "$PRSTFILE")" ; then + error "-> The X264PARAMS variable is commented out or missing in your file!" + error "-> Please at least add to the file: X264PARAMS=\"ref=4\" (for example)" + echo + exit 1 + fi + fi + source "$PRSTFILE" +else + if -z "$vpreset" ; then + if -f "$CFG" -a -z "$(grep '^X264PARAMS' "$CFG")" ; then + error "-> The X264PARAMS variable is commented out" + error " or missing in '$CFG'" + error "-> Regenerating config file!" + echo + rm -f "$CFG" + genconfig_func + fi + fi +fi if ! -z "$FFMPEG" ; then if ! -x "$FFMPEG" ; then @@ -1072,36 +1076,40 @@ video_subtitles_func() { case "$1" in infile) - printf "How many Subtitles to Copy?: " + printf "How many Subtitles to Copy? 0-inf - default is 1: " read subcp case "$subcp" in + 0) SUBCP="0" ;; 1-9*) SUBCP="$subcp" ;; - ""|*) - error "-> Invalid or no value given!" + "") SUBCP="1" ;; + *) + error "-> Invalid value!" exit 1 ;; esac - for i in $(eval echo "{1..$SUBCP}"); do - submapvali="$(($i-1))" - printf "Sub $i: Specify a Subtitle to Copy example: 0:2: " - read subnri - if ! -z "${subnri}" ; then - printf "Sub $i: Specify the 3-letter Language Code for Metadata press 'Enter' to skip: " - read slangi - if ! -z "${slangi}" ; then - sublangi="-metadata:s:s:${submapvali} language=${slangi}" + if "$SUBCP" != "0" ; then + for i in $(eval echo "{1..$SUBCP}"); do + subindexi="$(($i-1))" + printf "Sub $i: Specify a Subtitle to Copy example: 0:2: " + read subnri + if ! -z "${subnri}" ; then + printf "Sub $i: Specify the 3-letter Language Code for Metadata press 'Enter' to skip: " + read slangi + if ! -z "${slangi}" ; then + sublangi="-metadata:s:s:${subindexi} language=${slangi}" + fi + subcopyi="-map ${subnri} -c:s:${subindexi} copy ${sublangi}" + # Workaround for an ffmpeg disposition issue + # where in some cases it sets subsequent tracks + # as default. + test "$i" = "1" && sdis="default" || sdis="none" + subdisi="-disposition:s:${subindexi} $sdis" + else + error "-> No value given!" + exit 1 fi - subcopyi="-map ${subnri} -c:s:${submapvali} copy ${sublangi}" - # Workaround for an ffmpeg disposition issue - # where in some cases it sets subsequent tracks - # as default. - test "$i" = "1" && sdis="default" || sdis="none" - subdisi="-disposition:s:${submapvali} $sdis" - else - error "-> No value given!" - exit 1 - fi - done + done + fi test "$subopt" = "2" && echo ;; ext) @@ -1128,38 +1136,42 @@ esac done fi - printf "How many External Subtitles to Add?: " + printf "How many External Subtitles to Add? 0-inf - default is 1: " read subext case "$subext" in + 0) SUBEXT="0" ;; 1-9*) SUBEXT="$subext" ;; - ""|*) - error "-> Invalid or no value given!" + "") SUBEXT="1" ;; + *) + error "-> Invalid value!" exit 1 ;; esac - for i in $(eval echo "{1..$SUBEXT}"); do - test ! -z "${submapval*}" && submapi="$((${submapval-1}+$i))" || submapi="$(($i-1))" - printf "Sub $i: Specify the Subtitle File: " - read -e subi - if ! -f "${subi}" ; then - error "-> No such file!" - exit 1 - else - printf "Sub $i: Specify the 3-letter Language Code for Metadata press 'Enter' to skip: " - read slngi - if ! -z "${slngi}" ; then - sublngi="-metadata:s:s:${submapi} language=${slngi}" - fi - EXTSUBSi="-i \"${subi}\"" - if ! -z "${submapval*}" ; then - sdispo="none" + if "$SUBEXT" != "0" ; then + for i in $(eval echo "{1..$SUBEXT}"); do + test ! -z "${subindex*}" && subidxi="$((${subindex-1}+$i))" || subidxi="$(($i-1))" + printf "Sub $i: Specify the Subtitle File: " + read -e subfilei + if ! -f "${subfilei}" ; then + error "-> No such file!" + exit 1 else - test "$i" = "1" && sdispo="default" || sdispo="none" + printf "Sub $i: Specify the 3-letter Language Code for Metadata press 'Enter' to skip: " + read slngi + if ! -z "${slngi}" ; then + sublngi="-metadata:s:s:${subidxi} language=${slngi}" + fi + EXTSUBSi="-i \"${subfilei}\"" + if ! -z "${subindex*}" ; then + sdispo="none" + else + test "$i" = "1" && sdispo="default" || sdispo="none" + fi + subdispoi="-disposition:s:${subidxi} $sdispo" + subcpyi="-map $i:0 -c:s:${subidxi} copy ${sublngi}" fi - subdispoi="-disposition:s:${submapi} $sdispo" - subcpyi="-map $i:0 -c:s:${submapi} copy ${sublngi}" - fi - done + done + fi ;; esac } @@ -1215,42 +1227,41 @@ sleep 1 AUDTRKS="$($FFPROBE -i "$input" 2>&1 | grep 'Stream #' | grep 'Audio' | sed 's| ||g')" if ! -z "$AUDTRKS" ; then - green "$AUDTRKS" ATRKS="$(echo "$AUDTRKS" | wc -l)" + green "$AUDTRKS" + echo + green "-> Detected $ATRKS audio tracks" else error "-> Could not detect any audio tracks!" - ATRKS="0" fi echo -if "$MAX_AUD_TRACKS" = "auto" ; then - test "$ATRKS" = "0" && MAX_AUD_TRACKS="1" || MAX_AUD_TRACKS="$ATRKS" -fi +printf "How many Audio Tracks to Encode or Copy? 0-inf - default is 1: " +read atracks +case "$atracks" in + 0) audparams1="-an"; ATRACKS="0" ;; + 1-9*) ATRACKS="$atracks" ;; + "") ATRACKS="1" ;; + *) + error "-> Invalid value!" + exit 1 + ;; +esac -for i in $(eval echo "{1..$MAX_AUD_TRACKS}"); do - audmapvali="$(($i-1))" - if "$i" = "1" -a "$ATRKS" != "0" ; then - defaudtrk="default is 0:1" - else - defaudtrk="press 'Enter' to skip" - fi - printf "Track $i: Specify the Audio Track to Encode or Copy $defaudtrk: " - read astreami - if -z "${astream1}" -a "$ATRKS" != "0" ; then - astream1="0:1" - fi - if ! -z "${astreami}" ; then +if "$ATRACKS" != "0" ; then + for i in $(eval echo "{1..$ATRACKS}"); do + audindexi="$(($i-1))" + printf "Track $i: Specify the Audio Track to Encode or Copy default is 0:1: " + read astreami + test -z "${astreami}" && atracki="0:1" || atracki="${astreami}" printf "Track $i: Specify the 3-letter Language Code for Metadata press 'Enter' to skip: " read alangi if ! -z "${alangi}" ; then - audlangi="-metadata:s:a:${audmapvali} language=${alangi}" + audlangi="-metadata:s:a:${audindexi} language=${alangi}" fi - fi -done - -test -z "$(echo "${astream*}" | sed 's| ||g')" && audparams1="-an" - -if "${audparams1}" != "-an" ; then + audmapi="-map ${atracki}" + done + echo brown " Available Audio Codecs" brown " ~~~~~~~~~~~~~~~~~~~~~~" @@ -1267,18 +1278,14 @@ echo " PCM -----> Channels Support: 8 (ffmpeg max)" echo " COPY ----> Channels Support: depends on audio codec" echo " NOSOUND -> Channels Support: N/A" -fi - -for i in $(eval echo "{1..$MAX_AUD_TRACKS}"); do - if ! -z "${astreami}" ; then + + for i in $(eval echo "{1..$ATRACKS}"); do echo - audmapi="-map ${astreami}" - # Workaround for an ffmpeg disposition issue # where in some cases it flags subsequent # tracks as default. test "$i" = "1" && adis="default" || adis="none" - auddisi="-disposition:a:${audmapvali} $adis" + auddisi="-disposition:a:${audindexi} $adis" printf "Track $i: Specify the Audio Codec default is AC3: " read acodeci @@ -1369,16 +1376,16 @@ fi ;; nosound) - audparams1="-an" - abitrate1="0" # nosound takes precedence so # clear any audio options given - if $i -ge 2 ; then - for t in $(eval echo "{2..$MAX_AUD_TRACKS}"); do - audparamst= - auddist= - done - fi + for t in $(eval echo "{1..$ATRACKS}"); do + audparamst= + auddist= + done + echo + error "-> NOSOUND chosen. Clearing all other audio options!" + audparams1="-an" + abitrate1="0" break ;; *) @@ -1445,13 +1452,13 @@ exit 1 ;; esac - audprofilei="-profile:a:${audmapvali} ${aacprofi} -afterburner:a:${audmapvali} 1" + audprofilei="-profile:a:${audindexi} ${aacprofi} -afterburner:a:${audindexi} 1" ;; flac) printf "Track $i: Specify the FLAC Compression Level ${abroptsi} - default is ${abrdefi}: " read abri test -z "${abri}" && acompleveli="${abrdefi}" || acompleveli="${abri}" - audcompleveli="-compression_level:a:${audmapvali} ${acompleveli}" + audcompleveli="-compression_level:a:${audindexi} ${acompleveli}" abtrmetai="@ CL ${acompleveli}" ;; pcm) @@ -1474,7 +1481,7 @@ printf "Track $i: Specify the Audio Bitrate in kbps ${abroptsi} - default is ${abrdefi}: " read abri test -z "${abri}" && abitratei="${abrdefi}k" || abitratei="${abri}k" - audbtri="-b:a:${audmapvali} ${abitratei}" + audbtri="-b:a:${audindexi} ${abitratei}" abtrmetai="@ $(echo "${abitratei}" | sed 's|k||') kbps" ;; esac @@ -1566,8 +1573,8 @@ ;; esac - audmetai="-metadata:s:a:${audmapvali} title=\"${ametai} ${achmetai} ${abtrmetai}\"" - audchani="-ac:a:${audmapvali} ${achi} -channel_layout:a:${audmapvali} \"${chlayouti}\"" + audmetai="-metadata:s:a:${audindexi} title=\"${ametai} ${achmetai} ${abtrmetai}\"" + audchani="-ac:a:${audindexi} ${achi} -channel_layout:a:${audindexi} \"${chlayouti}\"" if "$AUD_NORMALIZE" = "y" ; then printf "Track $i: Normalize the Audio Volume? y/N: " @@ -1595,7 +1602,7 @@ echo green "-> Track $i: detecting audio sample rate..." sleep 1 - aidi="$(($(echo "${astreami}" | awk -F: '{print $2}')-1))" + aidi="$(($(echo "${atracki}" | awk -F: '{print $2}')-1))" ASRi="$($FFPROBE -i "$input" -show_streams -select_streams a:${aidi} 2>&1 | sed -n 's|^sample_rate=||p')" if ! -z "${ASRi}" ; then green "-> Track $i: detected ${ASRi} Hz" @@ -1781,13 +1788,12 @@ afiltersi="$(echo "${aresamplei}${anormalizei}${avolumei}$atempo" | sed 's|,$||')" - test ! -z "${afiltersi}" && audfiltersi="-filter:a:${audmapvali} ${afiltersi}" + test ! -z "${afiltersi}" && audfiltersi="-filter:a:${audindexi} ${afiltersi}" fi - audparamsi="${audmapi} -c:a:${audmapvali} ${acdci} ${audprofilei} ${audcompleveli} ${audbtri} ${audchani} ${audfiltersi} ${audlangi} ${audmetai}" - - fi -done + audparamsi="${audmapi} -c:a:${audindexi} ${acdci} ${audprofilei} ${audcompleveli} ${audbtri} ${audchani} ${audfiltersi} ${audlangi} ${audmetai}" + done +fi if ! -z "$skipsetpts" ; then echo @@ -1820,9 +1826,9 @@ error "-> Skipping bitrate calculation!" else # Audio copy, get bitrate - for i in $(eval echo "{1..$MAX_AUD_TRACKS}"); do + for i in $(eval echo "{1..$ATRACKS}"); do if "${acodeci}" = "copy" ; then - aidi="$(($(echo "${astreami}" | awk -F: '{print $2}')-1))" + aidi="$(($(echo "${atracki}" | awk -F: '{print $2}')-1))" abtri="$($FFPROBE -i "$input" -show_streams -select_streams a:${aidi} 2>&1 | sed -n 's|^bit_rate=||p')" case "${abtri}" in 1-9*) abitratei="$((${abtri}/1000))" ;; @@ -1846,18 +1852,6 @@ ;; esac -test "$METADATA" = "n" && MDATA="-map_metadata -1" - -test "$CHAPS" = "n" && CHPS="-map_chapters -1" - -vidfilters="$(echo "$deinterlace$crop$deblock$denoise$scale$rotate$setpts$fps" | sed 's|,$||')" - -test ! -z "$vidfilters" && vfilters="-vf $vidfilters" - -test ! -z "$vpreset" && X264PARAMS=":force-cfr=1:threads=auto$colorprim$interlaced $vpreset" || X264PARAMS=":$X264PARAMS$colorprim" - -test ! -z "$COMMENT" && METACOMMENT="-metadata comment=\"$COMMENT\"" - # Small counter :) counter_func() { for i in 5 4 3 2 1 0; do @@ -1891,12 +1885,24 @@ if -z "$batchmode" ; then - OUTFILE="$(dirname "$OUTPUT")/$(basename "${OUTPUT%.*}" | sed 's| |_|g')" + OUTFILE="$(dirname "$OUTPUT")/$(basename "${OUTPUT%.*}" | sed 's| |_|g').sh" else - OUTFILE="$(dirname "$OUTPUT")/$(basename $0)_batch$$" + OUTFILE="$(dirname "$OUTPUT")/$(basename $0)_batch$$.sh" input="\$i" fi +test "$METADATA" = "n" && MDATA="-map_metadata -1" + +test "$CHAPS" = "n" && CHPS="-map_chapters -1" + +vidfilters="$(echo "$deinterlace$crop$deblock$denoise$scale$rotate$setpts$fps" | sed 's|,$||')" + +test ! -z "$vidfilters" && vfilters="-vf $vidfilters" + +test ! -z "$vpreset" && X264PARAMS=":force-cfr=1:threads=auto$colorprim$interlaced $vpreset $vtune" || X264PARAMS=":$X264PARAMS$colorprim" + +test ! -z "$COMMENT" && METACOMMENT="-metadata comment=\"$COMMENT\"" + encoder_func() { case "$1" in 1p|crf) @@ -1905,53 +1911,53 @@ OPTS2="${audparams*} ${auddis*} ${subcopy*} ${subcpy*} ${subdis*} ${subdispo*} $strict $movflags $METACOVER \"$OUTPUT\"" ;; 2p) - passone="stats=\"$OUTFILE.log\":pass=1:bitrate=$vbitrate" - passtwo="stats=\"$OUTFILE.log\":pass=2:bitrate=$vbitrate" + passone="stats=\"${OUTFILE%.*}.log\":pass=1:bitrate=$vbitrate" + passtwo="stats=\"${OUTFILE%.*}.log\":pass=2:bitrate=$vbitrate" OPTS1="-map 0:0" OPTS2="-an -f null -y /dev/null" OPTS3="${EXTSUBS*} -map 0:0 -disposition:v:0 default $ofps $annexb $NOSUBS $MDATA $CHPS $METATITLE $METAGENRE $METAYEAR $METACOMMENT $vfilters $sws" OPTS4="${audparams*} ${auddis*} ${subcopy*} ${subcpy*} ${subdis*} ${subdispo*} $strict $movflags $METACOVER \"$OUTPUT\"" ;; esac - echo "nice -n $NICE $FFMPEG -i \"$input\" $OPTS1 -c:v libx264 -x264opts $pmode$passone$X264PARAMS $vtune $OPTS2" + echo "nice -n $NICE $FFMPEG -i \"$input\" $OPTS1 -c:v libx264 -x264opts $pmode$passone$X264PARAMS $OPTS2" case "$1" in 2p) echo - echo "nice -n $NICE $FFMPEG -i \"$input\" $OPTS3 -c:v libx264 -x264opts $passtwo$X264PARAMS $vtune $OPTS4" + echo "nice -n $NICE $FFMPEG -i \"$input\" $OPTS3 -c:v libx264 -x264opts $passtwo$X264PARAMS $OPTS4" ;; esac } -echo "#!/usr/bin/env bash" > "$OUTFILE.sh" -echo "" >> "$OUTFILE.sh" +echo "#!/usr/bin/env bash" > "$OUTFILE" +echo "" >> "$OUTFILE" if ! -z "$batchmode" ; then - echo "$CHDIR" >> "$OUTFILE.sh" - echo "" >> "$OUTFILE.sh" - echo "$FORLOOP_START" >> "$OUTFILE.sh" - echo "$CHKFILE_START" >> "$OUTFILE.sh" + echo "$CHDIR" >> "$OUTFILE" + echo "" >> "$OUTFILE" + echo "$FORLOOP_START" >> "$OUTFILE" + echo "$CHKFILE_START" >> "$OUTFILE" fi -encoder_func $encmode >> "$OUTFILE.sh" -echo "" >> "$OUTFILE.sh" +encoder_func $encmode >> "$OUTFILE" +echo "" >> "$OUTFILE" if ! -z "$extracon" ; then - echo "grn() { echo -e \"\e1;32m\$1\e0;39;49m\"; }" >> "$OUTFILE.sh" - echo "red() { echo -e \"\e1;31m\$1\e0;39;49m\"; }" >> "$OUTFILE.sh" + echo "green() { echo -e \"\e1;32m\$1\e0;39;49m\"; }" >> "$OUTFILE" + echo "red() { echo -e \"\e1;31m\$1\e0;39;49m\"; }" >> "$OUTFILE" for i in $extracon; do - echo "" >> "$OUTFILE.sh" - echo "echo" >> "$OUTFILE.sh" - echo "grn \"-> Converting to $i...\"" >> "$OUTFILE.sh" - echo "" >> "$OUTFILE.sh" + echo "" >> "$OUTFILE" + echo "echo" >> "$OUTFILE" + echo "green \"-> Remuxing to $i...\"" >> "$OUTFILE" + echo "" >> "$OUTFILE" case "$i" in - avi|m2ts|mts|ts) echo "$FFMPEG -i \"$OUTPUT\" -map 0 -c copy -bsf:v h264_mp4toannexb \"${OUTPUT%.*}.$i\" >/dev/null 2>&1" >> "$OUTFILE.sh" ;; - *) echo "$FFMPEG -i \"$OUTPUT\" -map 0 -c copy \"${OUTPUT%.*}.$i\" >/dev/null 2>&1" >> "$OUTFILE.sh" ;; + avi|m2ts|mts|ts) echo "$FFMPEG -i \"$OUTPUT\" -map 0 -c copy -bsf:v h264_mp4toannexb \"${OUTPUT%.*}.$i\" >/dev/null 2>&1" >> "$OUTFILE" ;; + *) echo "$FFMPEG -i \"$OUTPUT\" -map 0 -c copy \"${OUTPUT%.*}.$i\" >/dev/null 2>&1" >> "$OUTFILE" ;; esac - echo "test \"\$?\" = \"0\" && grn \"-> Done\" || red \"-> Failed!\"" >> "$OUTFILE.sh" + echo "test \"\$?\" = \"0\" && green \"-> Done\" || red \"-> Failed!\"" >> "$OUTFILE" done - echo "echo" >> "$OUTFILE.sh" + echo "echo" >> "$OUTFILE" fi if ! -z "$batchmode" ; then - echo "$CHKFILE_END" >> "$OUTFILE.sh" - echo "$FORLOOP_END" >> "$OUTFILE.sh" + echo "$CHKFILE_END" >> "$OUTFILE" + echo "$FORLOOP_END" >> "$OUTFILE" fi -chmod +x "$OUTFILE.sh" +chmod +x "$OUTFILE" -source "$OUTFILE.sh" +source "$OUTFILE"
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.