Trucos para el Bashrc

bash_screenshot
Navegando por los foros de Gentoo me encontré este excelente post con diferentes trucos de Bash. Espero que los usen. Todos están estelares, por eso los quise compartir con ustedes.


Publicado por i92guboj (Moderador del Foro de Gentoo en español)
:
Éste es uno de esos hilos para pasar el rato.

Me gustaría conocer que tipo de trucos usa la gente en sus ficheros de inicio de bash (~/.bahsrc, ~/.bash_profile, etc.). No estoy interesado en prompts porque es una materia bastante trillada y sobre la que existe muchísima información. Mayormente estoy interesado en alias, funciones y funcionalidades no tan evidentes de bash. Para comenzar pongo algunos de los míos, por si a alguien le sirven.

Alias

Código:

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

Me gusta que los programas me pregunten antes de hacer algo irreversible. Si de verdad quiero sobre escribir sin confirmación siempre puedo usar -f o hacer algo como “yes | cp * /foo/”.

Cita:

alias ls='ls -h'

Tamaños en formato legible para ls

Código:

alias df='pydf'

Siempre lo uso en lugar de df. Su salida es más legible.

Código:

alias startx='startx \"$@\" & exit'

Lanza X con los parámetros suministrados y cierra el shell actual (por seguridad, más que nada).

Código:

alias nano="nano -w"

Lo típico. Para que nano no me corte las líneas. No se si esto es ahora lo predeterminado en su configuración.

Código:

alias dvdplay="mount /mnt/dvd; mplayer /mnt/dvd/*; umount /mnt/dvd"
alias vbox="sudo /sbin/modprobe vboxdrv; VirtualBox; sudo /sbin/rmmod vboxdrv"

No comment.

Soporte para ratón en mc bajo X

Código:

alias mc='mc -x'

Remote Cat

Virtualmente, “remote cat”. Es como hacer un cat a una url remota.
Código:

alias rcat='wget -q -O -'

Historial

Algunos trucos que uso para manejar el historial de bash de forma más efectiva.

Muestra el historial

Código:

alias h='history'

h3Muestra las líneas del historial que contengan la cadena suministrada

Código:

# Function to search on the bash history
function recal () {
if [ -z "$1" ]; then
echo "Uso: recal , para buscar en el historial de bash."
else
history | grep "$1" | grep -v recal
fi
}

Luego con ! puedes lanzar la entrada que quieras, por ejemplo:

Código:

$ recal eix
105 eix libelf
107 eix emul-
300 eix svn
301 eix subversion
311 eix wine
406 eix wesnoth
412 eix ati-drivers
496 eix rcat
$ !105
eix libelf
[I] dev-libs/libelf
Available versions: 0.8.4 (~)0.8.6 (~)0.8.9 (~)0.8.10 {debug elibc_FreeBSD nls}
Installed versions: 0.8.10(01:04:27 21/06/08)(nls -debug -elibc_FreeBSD)
Homepage: http://www.mr511.de/software/
Description: A ELF object file access library

Wine

Código:

# Function to run on wine
function winerun () {
DIR="$PWD"
cd "$1"
wine "$2"
cd "$DIR"
xgamma -gamma 1.0
}

Algunos programas no corren bien si antes no entramos en un determinado directorio (cosas de librerías dll y todo eso). Esta función recibe un directorio y un nombre de programa, y lo ejecuta. Luego vuelve al directorio anterior, y además restaura el gamma (algunos juegos tienen la mala costumbre de cambiarlo sin ni siquiera preguntar). Luego defino alias usando esta función para cada programa, por ejemplo:

Código:

alias undying='winerun "$HOME/.wine/drive_c/Archivos de programa/EA Games/undying/System/" "../Undying.exe"'
alias cod2='winerun "$HOME/.wine/drive_c/Archivos de programa/Activision/Call of Duty 2/" "CoD2SP_s.exe"'
alias rune='winerun "$HOME/.wine/drive_c/Rune/System/" "Rune.exe"'
alias n2='winerun "$HOME/.wine/drive_c/Archivos de programa/Atari/Neverwinter Nights 2/" "nwn2.exe"'
alias gp5='winerun "$HOME/.wine/drive_c/Archivos de programa/Guitar Pro 5/" "GP5.exe"'

Muy práctico.

Concatenar videos

Código:

function avijoin () {
local part1="$1"
local part2="$2"
local out_f="$3"
mencoder -oac copy -ovc copy -idx "$1" "$2" -o "$3"
}

Esta función recibe dos ficheros de video y produce un tercero. Solo está diseñada para pegar ficheros de video que estén codificados exáctamente de la misma forma, ya que no recodifica nada, tan solo copia los streams y recalcula los índices.

Añadir paths de forma sencilla

Código:

# Function to add a path
# Usage: add_to_path
add_path () {
if [ "$PATH" == "${PATH/$1/}" ]
then
PATH="$1:$PATH"
export PATH
fi
}

Esta función añade paths de forma fácil, comprobando que no estén duplicados. Se añaden al principio, por lo cual tomarán precedencia sobre los antiguos. Se usa de esta forma:

Código:

# We want paths :P
add_path "/usr/local/bin"
add_path "$HOME/bin"

Código:
export HISTIGNORE="&:l:ll:ls:pwd:[bf]g:exit:clear"
Elimina la muestra de entradas consecutivas duplicadas en el historial cuando buscamos con la flechita de "arriba"

La mascota para terminales😛

Código:
# Welcome the user
echo
echo ' (()__(()'
echo ' / \'
echo ' ( / \ \'
echo ' \ o o /'
echo ' (_()_)__/ \'
echo ' / _.==.____ \'
echo ' ( |--| )'
echo ' /\_,|__|--.__/\_'
echo ' / ( / \'
echo ' \ \ ( /'
echo ' ) \._____) /'
echo ' (((____.--(((____/'
echo

Otra forma de hacerlo es combinando fortune y cowsay, así tienes una mascota ascii que te dice chorrallidas nuevas cada vez, con algo como:
Código:
fortune | cowsay -f ~/themes/cows/osito.cow -W 55

Sustituir ~/themes/cows/osito.cow por las mascotas que se quiera de las incluidas en el paquete cowsay. Y el resultado queda ]así

Código:

explainuseflag() {
sed -n -e "s,^\([^ ]*:\)\?$1 - ,,p" \
/usr/portage/profiles/use.desc \
/usr/portage/profiles/use.local.desc
}

Creo que Ferdy (o tal vez gringo) mencionó esta función, me parece que euse -i hace lo mismo, pero me gusta porque escribo "expl[TAB]" y la completación de bash hace lo suyo (hace poco anunciaron que ahora las USEs estarán en otros ficheros, tal vez no le quede mucho tiempo de vida a esta función).

Ejemplo:
ekz@localhost ~ $ explainuseflag gnome
Adds GNOME support

Código:
alias ll="ls -l"

Añado un par de cosillas más ( que en su mayoría no son mías, las he sacado de otros bashrc) :
Código:
start () {
/etc/init.d/$1 start
}
stop () {
/etc/init.d/$1 stop
}
restart () {
/etc/init.d/$1 restart
}
zap () {
/etc/init.d/$1 zap
}
rca () {
/sbin/rc-update add $1 default
}
rcd () {
/sbin/rc-update del $1 default
}
run () {
nohup $@ &
}

Con esto p.ej. en vez de ejecutar /etc/init.d/xdm start simplemente podéis ejecutar start xdm

Un pager como dios manda

Código:
alias more='less'
export PAGER=less
export LESSCHARSET='latin1'
export LESSOPEN='|/usr/bin/lesspipe.sh %s 2>&-'
export LESS='-i -N -w -z-4 -g -e -M -X -F -R -P%t?f%f \
:stdin .?pb%pb\%:?lbLine %lb:?bbByte %bb:-...'

útil pal kernel :

- actualiza el link /usr/src/linux acorde al kernel en ejecución
- abre el menu de configuración del kernel
- habilita la compilación sobre distcc
- recompila los módulos

Código:
alias klink="rm /usr/src/linux && ln -sf /usr/src/linux-$(uname -r) /usr/src/linux"
alias kmenu="cd /usr/src/linux;make menuconfig"
alias ckmake="make CC="distcc" -j10"
function modrebuild (){
emerge -av `grep -l /lib/modules /var/db/pkg/*/*/CONTENTS | sed -e 's/\/var\/db\/pkg\//=/' -e 's/\/CONTENTS//'`
}

Para sacar los comentarios de un archivo de configuración

Código:
alias stripcom="sed -e 's/#.*//;/^\s*$/d' "$@" "

Para descomprimir archivos rápidamente

Código:
function unpack() {
if [ ! "$1" ] || [ "$2" ] ; then
echo "Uso: unpack ARCHIVO"
echo "donde ARCHIVO es gzip, bzip2, zip, rar"
else
TAR=$(which tar)
UNZIP=$(which unzip)
RAR=$(which rar)

TYPE=$(file "$1" | cut -d " " -f 2)
NOEXT=$(echo "$1" |cut -d "." -f 1)
echo $TYPE

if [ $TYPE == "gzip" ]; then
$TAR -xzf "$1"
elif [ $TYPE == "bzip2" ]; then
$TAR -xjf "$1"
elif [ $TYPE == "Zip" ]; then
echo file is a .zip!
unzip -d $NOEXT "$1"
elif [ $TYPE == "RAR" ]; then
echo file is a .rar!
rar x "$1" $NOEXT
fi

unset TAR
unset UNZIP
unset RAR
unset TYPE
unset NOEXT
fi
}

Crea un directorio y accede al mismo

Código:
function mkcd() {
mkdir -p "$*" && cd "$*" && pwd
}

Meterse en el directorio de un ebuild

Yo lo uso casi en exclusivo para meterme en el directorio de un ebuild., es decir, [b]ecd baselayout[/b] os meterá en el directorio del árbol de portage del paquete baselayout.

Código:

# find a given ebuild. based upon code by agriffis. does some fancy prediction,
# so it will find categories if necessary (eg efind sparc-dev-sources will find
# sys-kernel/sparc-dev-sources, and does partial name matching). prints the
# result in the form category/package .
efind() {
local efinddir cat pkg
efinddir=$(eportdir)

case $1 in
*-*/*)
pkg=${1##*/}
cat=${1%/*}
;;

?*)
pkg=${1}
cat=$(echo1 ${efinddir}/*-*/${pkg}/*.ebuild)
[[ -f $cat ]] || cat=$(echo1 ${efinddir}/*-*/${pkg}*/*.ebuild)
[[ -f $cat ]] || cat=$(echo1 ${efinddir}/*-*/*${pkg}/*.ebuild)
[[ -f $cat ]] || cat=$(echo1 ${efinddir}/*-*/*${pkg}*/*.ebuild)
if [[ ! -f $cat ]]; then
return 1
fi
pkg=${cat%/*}
pkg=${pkg##*/}
cat=${cat#${efinddir}/}
cat=${cat%%/*}
;;
esac

echo ${cat}/${pkg}
}
# find either a cvs co of gentoo's portage module or the portage directory, and
# echo the result.
eportdir() {
# does fast cache magic. portageq in particular is really slow... this makes
# subsequent calls to eportdir() pretty much instantaneous, as opposed to
# taking several seconds.
if [[ -n "${PORTDIR_CACHE}" ]] ; then
echo "${PORTDIR_CACHE}"
elif [[ -d ${HOME}/cvs/portage ]] ; then
PORTDIR_CACHE="${HOME}/cvs/portage"
eportdir
elif [[ -d /usr/portage ]] ; then
PORTDIR_CACHE="/usr/portage"
eportdir
else
PORTDIR_CACHE="$(portageq portdir )"
eportdir
fi
}
# change to an ebuild's directory.
ecd() {
local pc d

pc=$(efind $*)
d=$(eportdir)

if [[ $pc == "" ]] ; then
echo "nothing found for $*"
return 1
fi

cd ${d}/${pc}
}

echo1() {
echo "$1"
}

Sacan la descripción y la url de un ebuild

Código:

function edesc() {
cat *.ebuild | sed -ne 's-^DESCRIPTION="\(.*\)".*-\1-1p' | sort -u
}

function ewww() {
cat *.ebuild | sed -ne 's-^HOMEPAGE="\(.*\)".*-\1-1p' | sort -u
}

Los alias que mas debo usar :

Código:
alias distmon="DISTCC_DIR=/var/tmp/portage/.distcc distccmon-gnome &"
alias e="emerge -va"
alias ew="emerge -uaDv world"
alias esys="emerge -uavD system"
alias ey="emerge --sync && layman -s ALL && sync-cvs && ew"
alias crap="localepurge -v && repocacheman && purge-crap && dep -p -w "
alias enw="emerge -uaDN world"
alias unmerge="emerge --unmerge -av"
alias modrwx="chmod 744"
alias modrx="chmod 755"
alias modrw="chmod 644"
alias modr="chmod 444"
alias svu="svn update"
alias svs="svn status"
alias svc="svn commit"
alias sva="svn add"
alias mktar="tar -cvf"
alias mkbz2="tar -cvjf"
alias mkgz="tar -cvzf"
alias ncemerge="FEATURES="-distcc" MAKEOPTS="-j2" emerge -av"
alias r+="xset m 7 10"
alias r-="xset m default"
alias top="htop"
alias df="pydf"
alias x="startx"
alias Y="startx -- :1"
alias h="history"
alias free='free -m'
alias dmesg="dmesg | more"
alias netstat="netstat -ponatu"
alias 2vcd="ffmpeg -i $1.avi -target ntsc-svcd"
alias 1='fg %1'
alias 2='fg %2'
alias 3='fg %3'
alias 4='fg %4'
alias 5='fg %5'
alias 6='fg %6'
alias 11='bg %1'
alias 22='bg %2'
alias 33='bg %3'
alias 44='bg %4'
alias 55='bg %5'
alias 66='bg %6'
alias haziso="mkisofs -o $AlphaN.iso -b $WORK/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table $DEVDIR"

Otro truco que recomiendo:

Código:
# emerge app-shells/bash-completion

y luego poner en .bashrc
Código:
[[ -f /etc/profile.d/bash-completion ]] && source /etc/profile.d/bash-completion

Ahora el tabulador no solo completa nombres de arhivos sino casi todo (parámetros, opciones,usarios, hosts,...)

Otros trucos

Y para no irme de vacío hago un miniaporte jeje, el programa que lanza es trayer, un panel para los iconos de la bandeja del sistema (icontray) para aquellos escritorios que no traen el suyo (como enlightenment E17):

Código:
alias trayerd='nohup trayer --edge bottom --align right --widthtype request &'

Modificando el prompt

Código:
C1="\[33[0;30m\]" # Black
C2="\[33[1;30m\]" # Dark Gray
C3="\[33[0;31m\]" # Red
C4="\[33[1;31m\]" # Light Red
C5="\[33[0;32m\]" # Green
C6="\[33[1;32m\]" # Light Green
C7="\[33[0;33m\]" # Brown
C8="\[33[1;33m\]" # Yellow
C9="\[33[0;34m\]" # Blue

C10="\[33[1;34m\]" # Light Blue
C11="\[33[0;35m\]" # Purple
C12="\[33[1;35m\]" # Light Purple
C13="\[33[0;36m\]" # Cyan
C14="\[33[1;36m\]" # Light Cyanias
C15="\[33[0;37m\]" # Light Gray
C16="\[33[1;37m\]" # White
C17="\[33[1;39m\]" # Bright
P="\[33[0m\]" # Neutral

y al final del archivo pongo esto:

Código:
PS1="$C3[$C6\@$C3] $C3[$C8\u$C2$C5$VTUSE$C15@$C16\h$C3]$C3[$C4\w$C3]\n#:$P"

Bueno, pues he conseguido hacer que los scripts de inicio se gestionen de la forma rcxdm start con autocompletado, como lo hace Suse,y no Debian como había dicho antes.

Ahora escribiendo rc+[TAB] nos aparecen todos los servicios que cuelgan bajo /etc/init.d/ junto con el resto de comandos que empiecen con rc, claro. Luego seguimos con el ejemplo rcxdm +[TAB] y nos aparecen la listas de opciones para el script: broken ineed iuse needsme pause restart start status stop usesme zap

Código:

_rcgentoo_style_init()
{
local TCOMP_WORDS=${COMP_WORDS#*rc}
local script="/etc/init.d/${TCOMP_WORDS[0]}"
local cur="${COMP_WORDS[$COMP_CWORD]}"

if [[ ( -f "${script}" || -h "${script}" ) && -r "${script}" ]] \
&& [[ "${script}" != *.sh ]] \
&& [[ "$(head -n 1 "${script}")" = "#!/sbin/runscript" ]]
then
[[ $COMP_CWORD -gt 1 ]] && return 1
COMPREPLY=($(opts="start stop status restart pause zap ineed needsme iuse usesme broken"; \
eval "$(grep '^opts=' "${script}")"; echo "${opts}"))
[[ -n "$COMPREPLY" ]] || COMPREPLY=(start stop restart zap)
COMPREPLY=($(compgen -W "${COMPREPLY[*]}" -- "${cur}"))
else
COMPREPLY=($(compgen -o default -- "${cur}"))
fi
return 0
}

for DAEMON in /etc/init.d/* ; do
RCDAEMON=rc${DAEMON##*/}
alias $RCDAEMON=$DAEMON
complete -F _rcgentoo_style_init $RCDAEMON
done
unset RCDAEMON DAEMON

Pues he seguido tu consejo y he mirado también en las páginas info y he encontrado algo de información aquí info:/bash/Programmable Completion Builtins, y estudiando un poco los scripts que hay en /etc/bash_completion y /etc/bash_completion.d/.

Pues naa, el script que lo lanza.

Código:
function info () {
if [ $TERM != linux ] && [ -z $SSH_TTY ]; then
konqueror info:$1 --profile webbrowsing &
else
/usr/bin/info $1
fi
}

Buscando porqué los aliases y las funciones no me funcionaban con el comando sudo, he encontrado esta función y asunto resuelto:

Código:

# Wrap sudo to handle aliases and functions
# Wout.Mertens@gmail.com
#
# Comments and improvements welcome

sudo ()
{
local c o t parse

# Parse sudo args
OPTIND=1
while getopts xVhlLvkKsHPSb:p:c:a:u: t; do
if [ "$t" = x ]; then
parse=true
else
o="$o -$t"
[ "$OPTARG" ] && o="$o $OPTARG"
fi
done
shift $(( $OPTIND - 1 ))

# If no arguments are left, it's a simple call to sudo
if [ $# -ge 1 ]; then
c="$1";
shift;
case $(type -t "$c") in
"")
echo No such command "$c"
return 127
;;
alias)
c="$(type "$c"|sed "s/^.* to \`//;s/.$//")"
;;
function)
c=$(type "$c"|sed 1d)";\"$c\""
;;
*)
c="\"$c\""
;;
esac
if [ -n "$parse" ]; then
# Quote the rest once, so it gets processed by bash.
# Done this way so variables can get expanded.
while [ -n "$1" ]; do
c="$c \"$1\""
shift
done
else
# Otherwise, quote the arguments. The echo gets an extra
# space to prevent echo from parsing arguments like -n
# Note the lovely interactions between " and ' ;-)
while [ -n "$1" ]; do
c="$c '$(echo " $1"|sed -e "s/^ //" -e "s/'/'\"'\"'/")'"
shift
done
fi
# Run the command with verbose options
echo Executing sudo $o -- bash -x -v -c "$c" >&2
command sudo $o bash -xvc "$c"
else
echo sudo $o >&2
command sudo $o
fi
}

Algunos simples de portage

Código:

alias instalados='cd /var/db/pkg/ && for i in */*; do ls -d $i; done'
alias p.keywords='geany /etc/portage/package.keywords'
alias p.use='geany /etc/portage/package.use'
alias p.mask='geany /etc/portage/package.mask'
alias p.unmask='geany /etc/portage/package.unmask'
alias make.conf='geany /etc/make.conf'
alias usemerge='emerge -pv'
alias upmerge='emerge --update --deep --newuse'
alias demerge='emerge --sync && layman -S && update-eix'

Tengo un equipo al que aún no he pasado a la rama ~arch pero cada día le voy instalando cada vez más paquetes de esta, y debido a lo vago que soy me he creado esta tonta función para no tener que estar editando a mano el dichoso package.keywords porque además me gusta que esté ordenado alfabéticamente.

Con un simple addarch x11-wm/compiz ya lo hace todo.
Código:

# Añade ~arch en /etc/portage/package.keywords y ordena alfabéticamente
addarch () {
local a n tmp
a=/etc/portage/package.keywords
n="$@ ~"
tmp=/tmp/addarch.tmp
echo $n >> $a
sort -u $a >> $tmp
mv -f $tmp $a
}

Y ya puestos para sacar paquetes del listado:
Código:

# Borra el paquete indicado de /etc/portage/package.keywords
delarch () {
local a n tmp
a=/etc/portage/package.keywords
n="$@ ~"
tmp=/tmp/delarch.tmp
grep -v -e "$n" $a >> $tmp
mv -f $tmp $a
}

Si, ya se que está autounmask, pero no me gusta que me separe cada paquete por archivos y he tenido algunos problemas en los que se queda indefinidamente añadiendo la misma línea, sumado a que me gusta saber que otras dependencias me pide para poder controlar que se instala.

Queriendo hacer algo parecido al addarch y delarch pero con el package.use me he encontrado con app-portage/flagedit, tan sencillo como:
Código:
flagedit net-im/amsn +gnome
para añadir una use y
Código:
flagedit net-im/amsn %gnome
para eliminarla.

Usar flagedit --help para ver el resto de posibilidades.

Nunca recuerdo los octales asi que estos me sirven bastante:

Código:

alias rw-='chmod 600'

alias rwx='chmod 700'

alias r--='chmod 644'

alias r-x='chmod 755'

Estos los uso en consola para FB:

Código:

alias fbmplayer='mplayer -vo fbdev -fs -vf scale=1280:768'

alias fblinks='links -driver fb'

Y para descomprimir a la rapida

Código:

exxxtract () {
if [[ -f $1 ]] ; then
case $1 in
*.tar.bz2) bzip2 -v -d $1 ;;
*.tar.gz) tar -xvzf $1 ;;
*.rar) rar x $1 ;;
*.deb) ar -x $1 ;;
*.bz2) bzip2 -d $1 ;;
*.lzh) lha x $1 ;;
*.gz) gunzip -d $1 ;;
*.tar) tar -xvf $1 ;;
*.tgz) gunzip -d $1 ;;
*.tbz2) tar -jxvf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*) echo "${1} Error!!!" ;;
esac
else
echo "${1} Error!!!"
fi
}

Otra función muy útil -> Crear un pdf de una página del comando man

Código:
# Funcion para guardar una página man en pdf
# uso: manpdf
manpdf()
{
man -t $1 | ps2pdf - > $2
}

Para abrir las páginas man con konqueror:

Me he dado cuenta que si lanzas screen bajo un terminal Linux /dev/tty* la función man e info de arriba se queja por encontrar entorno gráfico. El problema radica en la variable &TERM se asigna como screen.linux y no la he tenido en cuenta al lanzar la función, la corrijo y queda como sigue para man e info:

Código:

function man () {
if which konqueror >& /dev/null && [ $TERM != linux ] && \
[ $TERM != screen.linux ] && [ -z $SSH_TTY ]; then
konqueror man:$1 --profile webbrowsing &
else
/usr/bin/man $1
fi
}

function info () {
if which konqueror >& /dev/null && [ $TERM != linux ] && \
[ $TERM != screen.linux ] && [ -z $SSH_TTY ]; then
konqueror info:$1 --profile webbrowsing &
else
/usr/bin/info $1
fi
}

P.D: He añadido que se detecte si konqueror está instalado

Ver videos en el EeePC

Mi granito de arena. Para el eeepc, donde a veces miro videos que tienen una resolución descomunal y la grafica a veces no da para más (es la pantalla tan chiquitina... (y como no hay grafica que haga milagros pues me tengo que buscar la vida):

Código:
alias lowmplayer ='mplayer -hardframedrop -nocorrect-pts -autosync 30 -cache-min 30 -vfm ffmpeg -lavdopts lowres=1:fast:skiploopfilter=all'

Copiar un DVD al HDD

:

copydvd() {
dvdbackup -M -i $1 -o $2
}

He escrito una pequeña mejora para la función avijoin poder pasarle 2 ó 3 ficheros para unir. El último fichero que le pasemos será el resultado de la unión de los anteriores ficheros. Además comprueba si el archivo que le pasamos como resultado existe y si existe sale de la función sin hacer nada.

Código:

function avijoin {
case $# in
3) [ -f "$3" ] &mencoder -quiet -oac copy -ovc copy -idx "$1" "$2" -o "$3" ;;
4) [ -f "$4" ] &mencoder -quiet -oac copy -ovc copy -idx "$1" "$2" "$3" -o "$4" ;;
*) echo "Usage: avijoin part1 part2 [part3] output_file" ;;
esac
}

Espero que los disfruten. Son bienvenidos otros trucos

No comments yet

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s