# [bashrc] - Trucos para bash

## i92guboj

Buenas.

É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

```

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/".

 *Quote:*   

> 
> 
> alias ls='ls -h'
> 
> 

 

Tamaños en formato legible para ls.

```

alias df='pydf'

```

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

```

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

```

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

```

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.

```

alias dvdplay="mount /mnt/dvd; mplayer /mnt/dvd/*; umount /mnt/dvd"

alias vbox="sudo /sbin/modprobe vboxdrv; VirtualBox; sudo /sbin/rmmod vboxdrv"

```

No comment.

```

alias mc='mc -x'

```

Soporte para ratón en mc bajo X.

```

alias rcat='wget -q -O -'

```

Virtualmente, "remote cat". Es como hacer un cat a una url remota.

Historial

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

```

alias h='history'

```

Muestra el historial.

```

# Function to search on the bash history

function recal () {

  if [ -z "$1" ]; then

    echo "Uso: recal <cadena>, para buscar <cadena> en el historial de bash."

  else

    history | grep "$1" | grep -v recal

  fi

}

```

Muestra las líneas del historial que contengan la cadena suministrada.

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

```

$ 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

```

# 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:

```

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

```

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

```

# Function to add a path

# Usage: add_to_path <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:

```

# We want paths :P

add_path "/usr/local/bin"

add_path "$HOME/bin"

```

#THE END

Ahí queda eso. Saludos!   :Cool: 

----------

## achaw

Genial. Me quede con recal, me parecio muy util. Hay uno que tengo yo que elimina la muestra de entradas consecutivas duplicadas en el historial cuando buscamos con la flechita de "arriba"  :Very Happy: 

```
export HISTIGNORE="&:l:ll:ls:pwd:[bf]g:exit:clear"
```

Saludos

----------

## Cereza

Pues yo voy a poner la chorrada de turno, la mascota para terminales :P

Monigote en ascii para el .bashrc

```
# 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:

```
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 tal que así.

Hala, ya he puesto mi pequeño y nada pero que nada practico pero sí lúdico aporte.

----------

## Coghan

Gracias, me encanta cuando te aburres.

 *i92guboj wrote:*   

> 
> 
> ```
> 
> alias nano="nano -w"
> ...

 

En /etc/nanorc puedes añadir la línea set nowrap y obtienes el mismo resultado.

Un alias tonto pero que me resulta muy útil:

```
alias ..='cd ..'
```

----------

## i92guboj

 *Coghan wrote:*   

> Gracias, me encanta cuando te aburres.

 

 :Laughing:   :Laughing: 

 *Quote:*   

> 
> 
>  *i92guboj wrote:*   
> 
> ```
> ...

 

Gracias por confirmarlo. Me parecía haber visto la opción por ahí pero no tenía ganas de releer toda la configuración ahora.

 *Quote:*   

> Un alias tonto pero que me resulta muy útil:
> 
> ```
> alias ..='cd ..'
> ```
> ...

 

Pues no se me había ocurrido. Simple y efectivo, me lo quedo  :Smile: 

----------

## ekz

Muy buenos tips, haber que tengo yo..

```

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).

```
ekz@localhost ~ $ explainuseflag gnome

Adds GNOME support
```

También tengo alias que me corrigen la escritura, como son:

```
alias eox='eix'

alias naon='nano'
```

 :Very Happy: 

Saludos!

----------

## lanshor

Este creo que lo vi en Suse hace algunos años, y desde entonces siempre lo uso:

```
alias ll="ls -l"
```

----------

## gringo

buena idea  :Smile: 

añado un par de cosillas mas  ( que en su mayoría no son mías, las he sacado de otros bashrc) :

```

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

```
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:-...'
```

un pager como dios manda  :Wink: 

```
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//'`

}
```

ú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 

```
alias stripcom="sed -e 's/#.*//;/^\s*$/d' "$@" "
```

para sacar los comentarios de un archivo de configuración.

```
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

}
```

para descomprimir archivos rápidamente.

```
function mkcd() {

  mkdir -p "$*" && cd "$*" && pwd

}

```

crea un directorio y accede al mismo.

```
# 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"

}

```

yo lo uso casi en exclusivo para meterme en el directorio de un ebuild., es decir,  ecd baselayout os meterá en el direcorio del árbol de portage del paquete baselayout.

```
function edesc() {

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

}

function ewww() {

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

}

```

sacan la descripción y la url de un ebuild.

los alias que mas debo usar :

```
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"

```

por si a alguien le sirven de algo.

saluetes

----------

## Stolz

Genial post, como siempre.

Mis alias

```
alias grep="grep --colour=auto"

alias ls="ls -lh --color"

alias la="ls -a"

alias top="htop"

alias l="locate -i"

alias man="/home/javi/scripts/man"
```

siendo /home/javi/scripts/man

```

#!/bin/bash

konqueror --profile webbrowsing man:$1
```

 *i92guboj wrote:*   

> 
> 
> alias df='pydf

 

Lo añado a mis alias igual que hice en su día con htop.

 *i92guboj wrote:*   

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

 

Para hace algo parecido uso la combinación de teclas Crontrol+r en Bash. Busca (de forma insensible a mayúsculas) en el historial los comandos en los que aparezca lo que teclees a continuación de pulsar Crontrol+r. Sucesivas pulsaciones de Crontrol+r busca sucesivas concordancias. Si quieres refinar más la búsqueda continuas escribiendo y sin necesidad de pulsar nada continua apareciendo los comandos que cumplen con el nuevo patrón. Cuando ya tienes el comando que quieres, pulsas INTRO y se ejecuta.

 *achaw wrote:*   

> Hay uno que tengo yo que elimina la muestra de entradas consecutivas duplicadas en el historial cuando buscamos con la flechita de "arriba" 

 Relacionado:

```
export HISTSIZE=1000

export HISTFILESIZE=1000

export HISTCONTROL="ignoredups"
```

Creo que por el nombre se sabe enseguida lo que hacen.

 *Coghan wrote:*   

> 
> 
> Un alias tonto pero que me resulta muy útil:
> 
> ```
> ...

 Tan simple y útil que es brillante. Gracias.

 *ekz wrote:*   

> También tengo alias que me corrigen la escritura, como son:
> 
> ```
> alias eox='eix'
> 
> ...

 Pensé que era el único!, yo también tengo alias jeo="joe"

gringo, me quedo con start(),stop(),... estaba haciendo algo para lo mismo pero con ncurses (dialog) pero lleva parado el tema meses.

Otro truco que recomiendo:

```
# emerge app-shells/bash-completion
```

y luego poner en .bashrc

```
[[ -f /etc/profile.d/bash-completion ]] && source /etc/profile.d/bash-completion
```

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

Y para acabar, como se que a más de uno le va a gustar, un enalce que acabo de descubrir esta mañana y aun no he acabado de leer:

http://www.ibm.com/developerworks/linux/library/l-10sysadtips/index.html?ca=drs-tp3008

Saludozzzzzzzz

----------

## Inodoro_Pereyra

WOW!!

Me han hecho perder un par de horas haciendo experimentos!  :Very Happy: 

Tengo mas o menos lo mismo que todos ustedes salvo quizá por:

 *.bashrc wrote:*   

> alias sr='screen -r'
> 
> alias ss='screen -S'
> 
> alias sd='screen -d'
> ...

 

No tenía ninguna función compleja ni nada fuera de algunos alias hasta hoy que me robé al menos el 99% de las ideas, gracias gente...

Salud!

**EDITO** Gracias por el link Stolz, acabo de aprender como 20 cosas nuevas  :Very Happy: 

----------

## i92guboj

Todo muy interesante. Más de uno de estos trocitos irá a mi bashrc, previa digestión jeje.

Aquí dejo un enlace a un script de descompresión que hicimos Cereza y yo hace tiempo, y que he vuelto a revisar para limpiarlo un poco. Soporta varios formatos y admite un único parámetro, que es el nombre del archivo a descomprimir. Descomprime en el directorio actual, más simple imposible:

http://jesgue.homelinux.org/scripts/u2

----------

## Annagul

Un hilo excelente, muchas gracias por compartir vuestros bashrc's   :Wink: .

Sin duda, hay más de uno que va a caer y seguro que será de uso casi diario. Por mi parte, los que más uso ya se han comentado, así que me temo que no puedo aportar nada útil.

PS: Stolz, genial enlace, gracias.

----------

## piponazo

Me ha encantado la ídea de este post. A ver si me pongo a verlo detenidamente y le dedico un rato, ya que he visto algunas cosas que parecen muy interesantes. 

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):

```
alias trayerd='nohup trayer --edge bottom --align right --widthtype request &'
```

----------

## 7th_sign

buenos los comentarios, algunos de esos tambien los usé cuando tuve mi primera laptop y hay otros que me hubieran sido de mucha útilidad conocerlos antes, pero un tiempo use muchas máquinas linux que pues no contaban con esas personalizaciones y por eso se me quedé con la mala costumbre de escribir todo el comando   :Confused:  , de hecho lo único que si hago es modificar el prompt del bash para diferenciarlo entre usuarios y/o máquinas, aunque no tiene nada que ver con alias se los pongo por que esto  va en el bashrc

 *Quote:*   

>          C1="\[\033[0;30m\]" # Black
> 
>          C2="\[\033[1;30m\]" # Dark Gray
> 
>          C3="\[\033[0;31m\]" # Red
> ...

 

y al final del archivo pongo esto

 *Quote:*   

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

 

para modificar el promt

aprovecho para hacer un comercial  :Very Happy:  a mi página por si tienen cuoriosidad de saber como se vería el promt :

http://ivan.rico.org.mx/index.php/Blog/SingleView/id/Colorear-el-PROMPT-1

Saludos

----------

## Coghan

 *Stolz wrote:*   

> 
> 
> ```
> #!/bin/bash
> 
> ...

 

No conocía que konqueror pudiese leer las man pages y me he tomado la libertad de cambiar algo tu forma de lanzarlo, para no tener que poner un script fuera del .bashrc y además que me detecte si estoy en la consola no gráfica y me lance el man tradicional en ese caso.

```
function man () {

  if [ $TERM != linux ] && [ -z $SSH_TTY ]; then

    konqueror man:$1 --profile webbrowsing &

  else

    /usr/bin/man $1

  fi

}
```

 *gringo wrote:*   

> 
> 
> ```
> start () {
> 
> ...

 

Siempre he buscado la forma de hacer esto a la manera que lo hace debian, por ejemplo rcxdm start, he probado tus funciones, pero les falta el completado, he intentado crearlo mediante bash_completion, pero me he liado. Seguiré estudiando un poco la forma de hacerlo, pues me he acostumbrado tanto a pulsar el tabulador que se echa en falta.

Con eselect también se pueden lanzar los scripts de inicio, por ejemplo eselect rc start xdm, pero son demasiados comandos, al final vuelvo al método tradicional.

----------

## Stolz

 *Coghan wrote:*   

> No conocía que konqueror pudiese leer las man pages ..

 También lee las páginas info  :Smile: 

 *Coghan wrote:*   

> ...me he tomado la libertad de cambiar algo tu forma de lanzarlo

 ¡Genial!, la heredo  :Wink: 

 *Coghan wrote:*   

>  he probado tus funciones, pero les falta el completado, he intentado crearlo mediante bash_completion, pero me he liado. Seguiré estudiando un poco la forma de hacerlo, pues me he acostumbrado tanto a pulsar el tabulador que se echa en falta.

 Me pasa exactamente lo mismo. Intenté documentarte sobre cómo hacer tus propios autocompeltados pero la documentación de la página oficial es inexistente. Al final opté por hacer un interfaz ncurses con "dialog" pero a los pocos días lo dejé parado.

----------

## Coghan

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 Debían 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

```
_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

```

 *Stolz wrote:*   

> Me pasa exactamente lo mismo. Intenté documentarte sobre cómo hacer tus propios autocompeltados pero la documentación de la página oficial es inexistente. Al final opté por hacer un interfaz ncurses con "dialog" pero a los pocos días lo dejé parado.

 

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/.

 *Stolz wrote:*   

> También lee las páginas info 

 

Pues naa, el script que lo lanza.

```
function info () {

  if [ $TERM != linux ] && [ -z $SSH_TTY ]; then

    konqueror info:$1 --profile webbrowsing &

  else

    /usr/bin/info $1

  fi

}
```

----------

## Coghan

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

```

# 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

}

```

----------

## pcmaster

Hablando de truquitos para bash, hace algún tiempo publiqué por estos lares un par de scripts de bash bastante útiles, cuyos enlaces ya están puestos en el hilo de "recopilación de los mejores mensajes y guías".

Son estos:

https://forums.gentoo.org/viewtopic-t-574118.html

https://forums.gentoo.org/viewtopic-p-4164740.html

----------

## Cereza

Cuantas cosas chulas estoy sacando de este hilo, gracias a todos :)

Se me acaba de ocurrir de casualidad un alias muy sencillito y muy chorras:

```
alias cdd='cd ~"
```

Saludos.

----------

## Coghan

 *Cereza wrote:*   

> Se me acaba de ocurrir de casualidad un alias muy sencillito y muy chorras:
> 
> ```
> alias cdd='cd ~"
> ```
> ...

 

Para eso ya existe el comando cd a secas.

----------

## achaw

Algunos simples de portage:

```
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' 
```

Saludos

----------

## i92guboj

 *Stolz wrote:*   

>  *Coghan wrote:*   No conocía que konqueror pudiese leer las man pages .. También lee las páginas info 

 

Milagros de los kio-slaves. Cosas como kio-slaves y kparts son las que hacen de kdelibs una de las infraestructuras mejores (si no la mejor) que conozco. Son funcionalidades no tan conocidas pero realmente potentes, info:/, man:/ fish:/, etc. etc. También se puede usar konqueror como un frontend para la configuración de kcontrol: settings:/, o bien para acceder a los recursos de almacenamiento del sistema en una forma más "a la windows", con system:/ o cosas como trash:/ o finger:/

Es un sistema fácilmente extensible y hay montones de kio-slaves para muchas propósitos distintos.

Perdón por el off-topic, no pude resistirme  :Razz: 

----------

## Cereza

 *Coghan wrote:*   

>  *Cereza wrote:*   Se me acaba de ocurrir de casualidad un alias muy sencillito y muy chorras:
> 
> ```
> alias cdd='cd ~"
> ```
> ...

 

Fíjateeeeeeeeeee  :oops: :lol:

----------

## Inodoro_Pereyra

 *Cereza wrote:*   

>  *Coghan wrote:*    *Cereza wrote:*   Se me acaba de ocurrir de casualidad un alias muy sencillito y muy chorras:
> 
> ```
> alias cdd='cd ~"
> ```
> ...

 

Yo tampoco sabía  :Very Happy: 

Salud!

----------

## ColdWind

```
alias ci="echo stupid"
```

Una vez me cargué un fichero bastante importante al escribir mal "vi" y ejecutar "ci" sobre él. Desde entonces uso este alias para no cargarme nada cuando tengo un dia tonto.

----------

## pcmaster

¿ci?

----------

## Coghan

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.

```
# 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

```
# 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.

----------

## gringo

 *Quote:*   

> alias ci="echo stupid"

 

jejeje, yo tb. tengo un par de estos, sobre todo en máquinas que administro remotamente, donde p.ej. halt, shutdown y similares como que no son una opción para mi. 

@Coghan : gracias por tus addarch y delarch, yo tengo funciones similares pero tu solución me parece bastante mas elegante que la guarrería que tengo yo  :Wink: 

saluetes

----------

## Coghan

Queriendo hacer algo parecido al addarch y delarch pero con el package.use me he encontrado con app-portage/flagedit, tan sencillo como:

```
flagedit net-im/amsn +gnome
```

para añadir una use y 

```
flagedit net-im/amsn %gnome
```

 para eliminarla.

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

----------

## xSober

Nunca recuerdo los octales asi que estos me sirven bastante:

```

alias rw-='chmod 600'

alias rwx='chmod 700'

alias r--='chmod 644'

alias r-x='chmod 755'

```

Estos los uso en consola para FB:

```

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

alias fblinks='links -driver fb'

```

para descomprimir a la rapida  :Very Happy: 

```

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

}

```

salu2

----------

## piponazo

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

```
# Funcion para guardar una página man en pdf

# uso: manpdf <nombreComando> <ficheroSalida>

manpdf()

{

     man -t $1 | ps2pdf - > $2

}
```

----------

## sirope

Para limpiar la consola al salir:

```
$ nano ~/.bash_logout

```

Agregar:

```
/usr/bin/clear
```

 *Quote:*   

> Otra forma de hacerlo es combinando fortune y cowsay, así tienes una mascota ascii que te dice chorrallidas nuevas cada vez, 

 

Saludos a Larry!!   :Very Happy:   :Very Happy: 

----------

## inconexo

Hola!

la verdad es que a mi siempre me resulto un problema meter en un bucle for/while de bash una salida de consola que tuviera espacios:

```
admin@zorrilla ~/tmp/tmp2 $ echo "hola mundo" > out

admin@zorrilla ~/tmp/tmp2 $ for i in $(cat out ); do echo "${i}"; done

hola

mundo
```

o bien...

```
admin@zorrilla ~/tmp/tmp2 $ touch "hola mundo"

admin@zorrilla ~/tmp/tmp2 $ for i in $(ls); do echo "${i}"; done

hola

mundo
```

Como veis, trata el "hola" el "mundo" como dos variables

Bueno, para tratar en bash una salida que devuelva espacios, acentos... podemos usar la funcion "read":

```
admin@zorrilla ~/tmp/tmp2 $ echo "hola mundo" > out

admin@zorrilla ~/tmp/tmp2 $ cat out|while read i; do echo "${i}"; done

hola mundo
```

o bien...

```

admin@zorrilla ~/tmp/tmp2 $ touch "hola mundo"

admin@zorrilla ~/tmp/tmp2 $ ls|while read i; do file "${i}"; done

hola mundo: empty
```

Este problema se llevo consigo gran parte de mi salud y un par de noches en vela

Un saludo!

----------

## Coghan

Échale un vistazo a la variable IFS de bash, está como separador de campos, la puedes redefinir a tu gusto, busca información en la página man de bash.

----------

## inconexo

 *Coghan wrote:*   

> Échale un vistazo a la variable IFS de bash, está como separador de campos, la puedes redefinir a tu gusto, busca información en la página man de bash.

 

Vaya... cada dia me asombro de lo mucho que nos queda por aprender :)

Gracias por la informacion, no tenia ni idea. El "read" que comentaba arriba creo que es mas versatil... ya que caracteres como ñ, acentos, espacios... no influyen. Antes suplia lo que hace IFS con el "cut", o awk, pero lo tendre en cuenta en el futuro

Un saludo!

----------

## i92guboj

 *inconexo wrote:*   

> 
> 
> ```
> 
> admin@zorrilla ~/tmp/tmp2 $ touch "hola mundo"
> ...

 

En realidad no hace falta tanto artificio, saquemos a "ls" fuera del juego, no es necesario y solo crea problemas. No hay necesidad de eso, ni de usar cosas como

```

for i in $(ls)

```

Bash puede manejar eso directamente:

```

for i in /path/to/*

```

----------

## inconexo

 *i92guboj wrote:*   

> 
> 
> Bash puede manejar eso directamente:
> 
> ```
> ...

 

Sin embargo, el read es bastante versatil... tambien puedes recoger la salida de un cat, por ejemplo

Saludos!

----------

## i92guboj

 *inconexo wrote:*   

>  *i92guboj wrote:*   
> 
> Bash puede manejar eso directamente:
> 
> ```
> ...

 

Cierto, pero hay varias diferencias entre cat y ls. La salida de ls no ha sido diseñada para ser parseada de esa forma, y sobre todo con códigos ansi de colores puede dar más de un problema en ciertos tipos de terminales o consolas. Con cat ese problema no existe. 

Además, es por pura economía de lenguaje: ¿para qué usar ls cuando no es necesario?  :Razz: 

Por supuesto, para gustos: colores. Es lo bueno del software libre, cada uno puede escoger su solución ideal, y casi siempre hay varios caminos. Siempre se puede usar --color=none (o never, si no recuerdo mal) con ls si es necesario.  :Smile: 

----------

## AnimAlf

 *i92guboj wrote:*   

> Siempre se puede usar --color=none (o never, si no recuerdo mal) con ls si es necesario. 

 

También se le puede quitar el alias, por ejemplo con el ls:

Vemos su estado actual con:

~ $ command -v ls

alias ls='ls --color=auto'

y si le quitamos el alias:

~ $ unalias ls

~ $ command -v ls

/bin/ls

Saludos

----------

## i92guboj

 *AnimAlf wrote:*   

>  *i92guboj wrote:*   Siempre se puede usar --color=none (o never, si no recuerdo mal) con ls si es necesario.  
> 
> También se le puede quitar el alias, por ejemplo con el ls:
> 
> Vemos su estado actual con:
> ...

 

Mi forma favorita de saltarme un alias es usando la barra invertida.

```

$ alias ls='echo Esto es mi alias'

$ ls

Esto es mi alias

$ \ls

bin   dev  home   lib64       media  opt   root  storage  tmp  var

boot  etc  lib32  lost+found  mnt    proc  sbin  sys      usr
```

Lo uso bastante en algunos scripts, porque nunca puesdes estar seguro de que incluso los comandos más básicos estén intactos. Por supuesto si lo vas a usar muchas veces es más cómodo el unalias, pero ahí queda otra opción por si a alguien le sirve.

----------

## Coghan

 *Coghan wrote:*   

>  *Stolz wrote:*   
> 
> ```
> #!/bin/bash
> 
> ...

 

Una corrección; 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:

```
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

}

```

EDITO: He añadido que se detecte si konqueror está instalado.   :Wink: 

----------

## Coghan

 *Coghan wrote:*   

> 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 Debían 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
> 
> ```
> ...

 

Al final los chicos de sys-apps/openrc han inventado algo parecido: el comando rc-service, con auto-completado y todo. funciona tal como:

```
rc-service xdm start
```

Aunque con mi función lo haces escribiendo menos.   :Cool: 

----------

## edgar_uriel84

 *Coghan wrote:*   

> Buscando porqué los aliases y las funciones no me funcionaban con el comando sudo, he encontrado esta función y asunto resuelto:
> 
> ```
> 
> # Wrap sudo to handle aliases and functions
> ...

 

A mi no me resulta porque si coloco esta función, deja de pedirme la contraseña, es decir, si dejo la máquina y algún mandril hace "sudo su -" puedo darme por muerto  :Razz: 

¿Alguien sabe alguna otra solución para usar sudo en una función en bash?

----------

## Coghan

 *edgar_uriel84 wrote:*   

> A mi no me resulta porque si coloco esta función, deja de pedirme la contraseña, es decir, si dejo la máquina y algún mandril hace "sudo su -" puedo darme por muerto 
> 
> ¿Alguien sabe alguna otra solución para usar sudo en una función en bash?

 

¿Que ajuste de tiempo tienes para sudo?, por defecto no te pide la contraseña si las has puesto antes hasta pasados 5 minutos, pero se puede cambiar, puedes leer el siguiente documento para esto: http://www.gentoo.org/doc/es/sudo-guide.xml

----------

## sefirotsama

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):

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

Aún tengo que pulirlo (confieso que le metí flags a lo bestia pq tenia mono de mirar episodios de GUNDAM, xD).

Éste otro venia en un debian:

```
# append to the history file, don't overwrite it

shopt -s histappend
```

Me apunto algunos de vuestros trucos (cuando rehaga un blog tal vez haga un artículo con parte de esto o lo suba a alguna wiki).

Un saludo a todos

EDITO: @Coghan si los llamas sin tener las X's iniciadas peta? (lo siento pero no lo he probado, estoy de examenes pero eso que siempre me tira el tema y sin querer voy mirando el foro...)

----------

## Coghan

 *sefirotsama wrote:*   

> EDITO: @Coghan si los llamas sin tener las X's iniciadas peta? (lo siento pero no lo he probado, estoy de examenes pero eso que siempre me tira el tema y sin querer voy mirando el foro...)

 

¿A que alias o función te refieres? En principio esto es bash, deben funcionar todos tanto en consola como en X.

----------

## sefirotsama

 *Coghan wrote:*   

>  *sefirotsama wrote:*   EDITO: @Coghan si los llamas sin tener las X's iniciadas peta? (lo siento pero no lo he probado, estoy de examenes pero eso que siempre me tira el tema y sin querer voy mirando el foro...) 
> 
> ¿A que alias o función te refieres? En principio esto es bash, deben funcionar todos tanto en consola como en X.

 

Ok, ya lo he testeado y veo que funciona en todos los casos. Era por el man() y info(), que me temia que luego no funcionara si no tenia las X.

Grácis, y lo siento por preguntar tontamente.

----------

## the incredible hurd

 *xSober wrote:*   

> Nunca recuerdo los octales asi que estos me sirven bastante

 

Para eso precisamente tengo yo un alias, por raro que parezca yo con lo que me llevo mal es con las letras:

alias permisos='cat /ruta/al/archivo/permisos.txt'

Mi archivo permisos.txt es el siguiente (algún día de desesperación lo encontré en google):

 *permisos.txt wrote:*   

> 
> 
> Binary value	Octal value	Text value
> 
> 000		0		---
> ...

 

Con cat me aparece perfectamente tabulado, pero si leyendo lo escrito alguien se atreve a ponerlo como función y delimitando todo lo que los foros se cargan automáticamente (tabuladores y/o espacios) pues perfecto.

Edito:   :Confused: 

Binary value

000

001

010

011

100

101

110

111

Octal value

0

1

2

3

4

5

6

7

Text value

---

--x

-w-

-wx

r--

r-x

rw-

rwx

y todo perfectamente tabulado   :Evil or Very Mad: 

----------

## i92guboj

the incredible hurd, todo debería salir alineado si usas code tags en lugar de quote. Los bloques code usan la fuente monotype. Así que todo debería quedar bien alineado con code, siempre que tengas una fuente monotipo configurada correctamente para el caso en tu browser.

En cuanto a los tabuladores, la cosa es más compleja, porque depende del mecanismo que uses para copiar y pegar, la procedencia (editor, terminal), el browser y varias cosas más. Lo más seguro es convertirlo todo a espacios (o simplemente copiarlo desde un terminal, supongo).

----------

## the incredible hurd

 *i92guboj wrote:*   

> the incredible hurd, todo debería salir alineado si usas code tags en lugar de quote. Los bloques code usan la fuente monotype. Así que todo debería quedar bien alineado con code, siempre que tengas una fuente monotipo configurada correctamente para el caso en tu browser.
> 
> En cuanto a los tabuladores, la cosa es más compleja, porque depende del mecanismo que uses para copiar y pegar, la procedencia (editor, terminal), el browser y varias cosas más. Lo más seguro es convertirlo todo a espacios (o simplemente copiarlo desde un terminal, supongo).

 

Lo pongo en práctica:

```

Binary value    Octal value     Text value

000             0               ---

001             1               --x

010             2               -w-

011             3               -wx

100             4               r--

101             5               r-x

110             6               rw-

111             7               rwx

Advanced file permissions

suid bit (set user ID)          4000

sgid bit (set group ID)         2000

sticky bit                      1000

```

Sí señor, justo como me aprece en consola o en gnome-terminal. Evidentemente estaba copiado desde un terminal yno, con quote no aparece correctamente y con code sí (en los foros).

Muchas gracias por la solución al problema, si alguien se atreve a ponerlo como función, me alegraría. Soy muy   :Confused:  y estoy intentando hacerlo con un printf, como todos los Ceporros (conste en acta: sin ánimo de ofender, todo lo contrario).

----------

## pcmaster

He visto ceporros ahogarse en un vaso de agua  :Very Happy:   :Very Happy:   :Very Happy: 

Ahora en serio, no es tan difícil:

r=4 (lectura)  - 100 en binario

w=2 (escritura) - 010 en binario

x=1 (ejecución) - 001 en binario

Se suman los valores para cada usuario y se ponen. Ejemplo: Queremos que el propietario tenga TODOS los permisos, que el grupo tenga lectura + ejecución, y los demás nada:

todos= 1+2+4=7

el grupo: 1+4=5

los demás =0

hacemos un chmod 750 archivo, y ya está.

----------

## i92guboj

```

Binary value    Octal value     Text value

000             0               ---

001             1               --x

010             2               -w-

011             3               -wx

100             4               r--

101             5               r-x

110             6               rw-

111             7               rwx

```

Ésta tabla es la base de todo. La cosa es bien sencilla, tres permisos distintos: rwx. Para cada uno de ellos 1 es activado y 0 desactivado. Así 101 activa read and exec, pero no write. Convirtiendo ese número a octal tenemos un 5. Si repetimos el proceso para cada uno de user, group y others tenemos el numerito de 3 cifras que se usa como abreviatura a la hora de ejecutar chmod.

Por supuesto tanta conversión es un poco molesta, lo más sencillo es recordar que 4 es read, 2 es write y 1 es exec. Luego es tan solo sumar, como pcmaster muy bien dice arriba. Así 5 es 4+1, read and exec, 7 es 4+2+1 (todos los permisos), etc. etc. Es simple álgebra, y una vez que se tiene soltura los números empiezan a resultar tan naturales como si vieras los permisos escritos uno por uno delante de tus narices.  :Wink: 

the incredible hurd, no entiendo lo que quieres decir con lo de escribir ésto como una función. Si me das los detalles de lo que quieres hacer seguramente pueda echarte un cable con eso  :Smile: 

----------

## the incredible hurd

 *i92guboj wrote:*   

> the incredible hurd, no entiendo lo que quieres decir con lo de escribir ésto como una función. Si me das los detalles de lo que quieres hacer seguramente pueda echarte un cable con eso 

 

Algo así ha quedado...

```

permisos () {

printf "Binary value    Octal value     Text value\n\n";

printf "000             0               ---\n";

printf "001             1               --x\n";

printf "010             2               -w-\n";

printf "011             3               -wx\n";

printf "100             4               r--\n";

printf "101             5               r-x\n";

printf "110             6               rw-\n";

printf "111             7               rwx\n\n\n";

printf "Advanced file permissions\n\n";

printf "suid bit (set user ID)          4000\n";

printf "sgid bit (set group ID)         2000\n";

printf "sticky bit                      1000\n\n";

}

```

Estaba pensando en añadir subrayados y demás, pero así basta y sobra...

Lo de Ceporro es porque he tenido que pensar 3 veces antes de no añadir un

#include <stdio.h>

 :Very Happy: 

----------

## i92guboj

 *the incredible hurd wrote:*   

>  *i92guboj wrote:*   the incredible hurd, no entiendo lo que quieres decir con lo de escribir ésto como una función. Si me das los detalles de lo que quieres hacer seguramente pueda echarte un cable con eso  
> 
> Algo así ha quedado...
> 
> ```
> ...

 

 :Laughing:  Tampoco habría hecho daño, por el '#' jeje   :Cool: 

Por cierto, los punto y coma finales tampoco son necesarios en bash (tampoco es que hagan daño igualmente).

----------

## edgar_uriel84

 *the incredible hurd wrote:*   

> 
> 
> ```
> 
> Binary value    Octal value     Text value
> ...

 

Pues a mi esto del archivo me ha dado la idea de hacer apuntes de cosas que suelo enseñar y/o olvidar porque aunque son importantes no realizo tareas realizas con eso muy seguido. Soy miembro de LIDSOL un laboratorio de la UNAM (México) donde nos dedicamos al Software Libre y me he fijado que los que apenas están aprendiendo no se les olvida como funciona "ls" se les olvida que comando se usa para listar el contenido de un directorio. Por eso creo que es una buena idea, además no conozco un software que lo haga, si existe avísenme (Excluir Firefox-Google   :Laughing:  ).

Entonces serviría hacer una guía de comandos básicos para que los novatos la consulten mientras aprender a usar la consola, esto con solo teclear "$ayuda_comandos" o algo similar. Haré esto que les comento y lo subiré (en un rato porque mi tiempo es limitado) haber que opinan.

Aprovecho para agregar una función sencilla y que uso mucho, copiar un DVD al HDD:

```

copydvd() {

        dvdbackup -M -i $1 -o $2

}

```

----------

## jgascon

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.

```

function avijoin {

  case $# in

    3) [ -f "$3" ] && { echo "$3 file exists!" ; return 1; }

       mencoder -quiet -oac copy -ovc copy -idx "$1" "$2" -o "$3" ;;

    4) [ -f "$4" ] && { echo "$4 file exists!" ; return 1; }

       mencoder -quiet -oac copy -ovc copy -idx "$1" "$2" "$3" -o "$4" ;;

    *) echo "Usage: avijoin part1 part2 [part3] output_file" ;;

  esac

}

```

----------

## papu

hola que tal , creo es el lugar ideal para hacer esta pregunta  :Smile: 

no consigo saber la diferencia entre el .bashrc y el .bash_profile, si alguien me lo explicara bien, asi entendería la diferencia de poner alias o comandos en uno u otro y el porque de hacerlo en uno y no en otro.

Seguidamente os paso mis comandos ( que no creo interesen a nadie)

bashrc:

```
#ALIAS

        alias re='sudo shutdown -r now'

        alias st='sudo shutdown -h now'

        alias rR='sudo rm -R'

        alias e1n='sudo emerge -avuDN  --keep-going world'

        alias e1='sudo emerge -avuD  --keep-going world'

        alias av='sudo emerge -av'

        alias sx='startx'

        alias l='ls -a'

        alias ll='ls -lah'

        alias n='sudo nano -w'

        alias ocz='sudo mount -t vfat /dev/disk/by-id/usb-OCZ_ATV_AA04012700129708-0\:0-part1 /mnt/ocz/'

        alias ey='sudo eix-sync'

        alias ..="cd .."

        alias h="history"

```

y estos en el bash_profile:

```
PATH="/usr/lib/ccache/bin:/opt/bin:${PATH}"

export LANG="ca_ES.UTF-8"

export LC_COLLATE="C"

```

el comando referente al lenguaje me permite tener entornos idiomaticos a escojer por cada usuario.

 :Smile: 

----------

## i92guboj

 *papu wrote:*   

> hola que tal , creo es el lugar ideal para hacer esta pregunta 
> 
> no consigo saber la diferencia entre el .bashrc y el .bash_profile, si alguien me lo explicara bien, asi entendería la diferencia de poner alias o comandos en uno u otro y el porque de hacerlo en uno y no en otro.
> 
> 

 

~/.bashrc se lee cada vez que se inicia una sesión de bash que sea interactiva y que no sea de login. Traducido al castellano plano: cada vez que abres un terminal como xterm, konsole, urxvt o el que tú uses.

~/.bash_profile se lee cada vez que se inicia una sesión de bash que sea interactiva y que sea de login. Por ejemplo, cuando haces login en una consola de texto fuera de X.

----------

## Popolous

A ver si puedo ayudarte un poco que yo empecé en esto de bash hace poco:

bash_profile es el archivo para cada entorno de bash individual, es decir, para cada usuario.  Y como te han dicho, bashrc es para shells que no requieren login (por ejemplo, las arrancadas desde X).

Te recomiendo que te leas La Guía Bash para principiantes (en inglés). Ahí vienen explicadas, entre otras, las dudas que planteas.

¡Saludos!

----------

## papu

 *i92guboj wrote:*   

>  *papu wrote:*   hola que tal , creo es el lugar ideal para hacer esta pregunta 
> 
> no consigo saber la diferencia entre el .bashrc y el .bash_profile, si alguien me lo explicara bien, asi entendería la diferencia de poner alias o comandos en uno u otro y el porque de hacerlo en uno y no en otro.
> 
>  
> ...

 

aja ya si eso lo entendia en ingles pero me quedaba igual como no se el concepto de consola interactiva pues es por eso, entonces el orden de carga es bash_profile(la consola inicio en modo texto)  y luego se carga el bashrc? 

es curioso esto

```
export LANG="ca_ES.UTF-8"

export LC_COLLATE="C" 
```

si inicio con kdm si no lo pongo en bash_profile no lo detecta pero hasta ahora que usaba startx dejandolo en bashrc si funcionaba, no tengo claro los conceptos entre las consolas  :Very Happy: 

saludos, adéu.

----------

## i92guboj

 *papu wrote:*   

>  *i92guboj wrote:*    *papu wrote:*   hola que tal , creo es el lugar ideal para hacer esta pregunta 
> 
> no consigo saber la diferencia entre el .bashrc y el .bash_profile, si alguien me lo explicara bien, asi entendería la diferencia de poner alias o comandos en uno u otro y el porque de hacerlo en uno y no en otro.
> 
>  
> ...

 

No necesariamente, aunque usualmente si. Siempre hay un primer shell de login, tarde o temprano. ~/.bashrc no tiene por qué cargarse en absoluto, si no inicias ningún shell interactivo a mano.

 *Quote:*   

> es curioso esto
> 
> ```
> export LANG="ca_ES.UTF-8"
> 
> ...

 

Un mejor sitio para estas cosas es /etc/env.d/02locales, por ejemplo. Si lo quieres para un usuario solo entonces lo mejor es ponerlo en ambos, ~/.bashrc y ~/.bash_profile, así entres como entres a tus shells y al resto del sistema debería estar todo correcto.

----------

## papu

 *i92guboj wrote:*   

>  *papu wrote:*    *i92guboj wrote:*    *papu wrote:*   hola que tal , creo es el lugar ideal para hacer esta pregunta 
> 
> no consigo saber la diferencia entre el .bashrc y el .bash_profile, si alguien me lo explicara bien, asi entendería la diferencia de poner alias o comandos en uno u otro y el porque de hacerlo en uno y no en otro.
> 
>  
> ...

 

el /etc/env.d/02locales afecta a la sesión root la cual tengo configurada identico que en usario pero para idioma ingles, luego en mi usuario tengo lo anteriormente puesto que me carga el idioma catalan en concreto.

Un shell interactivo exactamente que es?  o sea al inicio de del s.o en modo consola se carga un shell, luego si le doy a alt+fx para cargar algun otro shell eso es considerado interactivo?

Porque sin usar kdm me bastaba con tenerlo en .bashrc todo y me lo detectaba tras un startx. ¿Entonces el orden logico del shell es como he dicho yo no?

Los comandos que yo desee poner  entonces pueden ponerse tanto en .bashrc como en bash_profile, es decir acepta los mismos sin problema ¿verdad?

o como tu dices poner los mismos en ambos para que la deteccion sea correcta en cualquier circunstancia.

es un poco lioso esto de los dos bash estos :O

saludos, adéu.

----------

## Coghan

```
# /etc/skel/.bash_profile

# This file is sourced by bash for login shells.  The following line

# runs your .bashrc and is recommended by the bash info pages.

[[ -f ~/.bashrc ]] && . ~/.bashrc

```

Esté código es el que se queda en $HOME/.bash_profile al crear cada usuario. Es bastante claro que lee .bashrc si este existe, por lo tanto de la forma que inicies un terminal siempre se leerá tu .bashrc. Con esto ya no será necesario añadir nada más a .bash_profile, déjalo todo en tu .bashrc y lo tendrás mejor ordenado y sin líos de si debe estar en un lado o en otro.

----------

## papu

 *Coghan wrote:*   

> 
> 
> ```
> # /etc/skel/.bash_profile
> 
> ...

 

sin duda lo tenía asi hasta ahora que iniciaba con startx , pero dado un problema al respecto del cual tengo puesto un post , ahora inicio mediante kdm y si tengo el idioma puesto en .basrc (como hasta ahora) no me carga en las X , si lo pongo en bash_profile si lo hace.

saludos, adéu.

----------

## i92guboj

 *papu wrote:*   

> 
> 
> el /etc/env.d/02locales afecta a la sesión root la cual tengo configurada identico que en usario pero para idioma ingles, luego en mi usuario tengo lo anteriormente puesto que me carga el idioma catalan en concreto.
> 
> 

 

Comprendo.

 *Quote:*   

> Un shell interactivo exactamente que es?  o sea al inicio de del s.o en modo consola se carga un shell, luego si le doy a alt+fx para cargar algun otro shell eso es considerado interactivo?

 

Un shell interactivo es un shell en el que tú puedes escribir y ejecutar comandos. Un shell the login en una vt es interactivo. Un shell dentro de un xterm es interactivo. El shell the se abre cuando ejecutar un script que comienza por "#!/bin/bash" no es interactivo, porque su entrada no está asociada a un terminal en el que tú puedas escribir, sino al script.

 *Quote:*   

> Porque sin usar kdm me bastaba con tenerlo en .bashrc todo y me lo detectaba tras un startx. ¿Entonces el orden logico del shell es como he dicho yo no?

 

No se como hace las cosas kdm. Es más, startkde es un script bash él mismo, y puede que use el comando source o similar para incorporar los archivos de inicialización del shell o algo. Por tanto, sobre el tema kde no puedo ayudar, no lo tengo instalado.

 *Quote:*   

> Los comandos que yo desee poner  entonces pueden ponerse tanto en .bashrc como en bash_profile, es decir acepta los mismos sin problema ¿verdad?

 

En principio, ambos son scripts de bash. Cualquier cosa que bash entienda puede ir en dichos ficheros. Sin embargo, ten en cuenta que son ficheros de inicialización, no librerías de código universales. Recomiendo sobriedad :p

 *Quote:*   

> o como tu dices poner los mismos en ambos para que la deteccion sea correcta en cualquier circunstancia.
> 
> es un poco lioso esto de los dos bash estos :O

 

Puede haber casos en los que quieras que una tarea se ejecute al hacer login, pero no cada vez que abres un xterm, es el propósito de todo este lío de archivos. Sí que es cierto que hay formas más elegantes de implementarlo que yo habría escogido, en lugar de la marea de archivos de inicialización que bash soporta.

----------

## papu

[quote="i92guboj"] *papu wrote:*   

> 
> 
> Puede haber casos en los que quieras que una tarea se ejecute al hacer login, pero no cada vez que abres un xterm, es el propósito de todo este lío de archivos. Sí que es cierto que hay formas más elegantes de implementarlo que yo habría escogido, en lugar de la marea de archivos de inicialización que bash soporta.

 

mmm ya , te refiers a cargar archivos a parte mediante el comando source dentro de  el/los .bash  ¿no?

 *Quote:*   

> 
> 
> source /home/usuario/.idioma
> 
> source /home/usuario/.alias
> ...

 

o algo parecido...mmm haciendo eso recuerdo que tube algun problema con la deteccion al inicio de session pero ya on recuerdo quizás fue por lo mismo que ahora he de cambiar los EXPORT al bash_profile(usando kdm) en lugar de como antes los tenia en bashrc usando startx.

Yo tampoco me gusta usar kdm pero es que no me va la X y no se como arreglarlo como explico aquí:

https://forums.gentoo.org/viewtopic-t-778922.html

saludos, adéu.

----------

## i92guboj

 *papu wrote:*   

>  *i92guboj wrote:*   
> 
> Puede haber casos en los que quieras que una tarea se ejecute al hacer login, pero no cada vez que abres un xterm, es el propósito de todo este lío de archivos. Sí que es cierto que hay formas más elegantes de implementarlo que yo habría escogido, en lugar de la marea de archivos de inicialización que bash soporta. 
> 
> mmm ya , te refiers a cargar archivos a parte mediante el comando source dentro de  el/los .bash  ¿no?

 

Me refiero a nivel interno de bash. Si yo hubiera programado bash probablemente habría incluído algún tipo de flag que pudiera ser chequeada desde dentro de bash para ver si la sesión actual es de login, interactiva o lo que sea, eliminando la necesidad de tanto archivo de inicio. Habría uno solo, y podríamos hacer cosas como

```
if [[ <this is a login session> ]]

then

   whatever

fi

```

Para mi es más práctico que tener montones de archivos separados. La cosa con bash es incluso más complicada, hay varios archivos más, todos (o casi) están listados en la sección "INVOCATION" de la página man de bash.

 *Quote:*   

> 
> 
> Yo tampoco me gusta usar kdm pero es que no me va la X y no se como arreglarlo como explico aquí:
> 
> https://forums.gentoo.org/viewtopic-t-778922.html
> ...

 

He colgado una respuesta en ese hilo.

----------

## papu

 *i92guboj wrote:*   

>  *papu wrote:*    *i92guboj wrote:*   
> 
> Puede haber casos en los que quieras que una tarea se ejecute al hacer login, pero no cada vez que abres un xterm, es el propósito de todo este lío de archivos. Sí que es cierto que hay formas más elegantes de implementarlo que yo habría escogido, en lugar de la marea de archivos de inicialización que bash soporta. 
> 
> mmm ya , te refiers a cargar archivos a parte mediante el comando source dentro de  el/los .bash  ¿no? 
> ...

 

aja, yo olvidé hace mucho tiempo programar en script y tampoco sabía mucho entonces me resulta más practico hacerlo asi ya que tampoco es que sea molesto y me funciona, la ventaja es que en linux se pueden hacer las cosas de muchas maneras y mas en gentoo, pero en mi caso por ahora no sabría como.

La otra respuesta la miro luego y te contesto por el otro hilo.

saludos, adéu.

----------

## carlos plaza

Como disfruto de Gentoo y de este foro, tengo que hacer mas tiempo para poder digerir toda este maravilloso ingenio y sabiduría gracias a todos, lastima que no tenga nada que aportar ya que tengo el vicio de escribir todos los comandos y como sufro cuando alguno se me olvida. pero ya tengo soluciones gracias a ustedes, se les admira.

----------

## ensarman

este tema esta interesantisimo... buenos posts,nunca lo habia visto, weno esto es lo unico propio que hace con el .bashrc

```
if [ ! -S /tmp/.X11-unix/X0 ]; then

    startx &

else

    if [[ `ps ax |grep SCREEN |grep -v grep |wc -l` = 0 && ${DISPLAY} ]]; then

        screen

    else

        screen -r

    fi

    clear

fi

```

hace esto:

# iniciar el Xorg al loguearme en cualquer consola virtual

# solamente ejecutar  Xorg si esque no existe otro Xorg

# ejecutar GNUscreen solo en la consola grafica(xterm, rxvt, gnome-terminal)

# si existe una sesion de screen abierta entrar a ella(solo en una consola grafica)

# en una consola virtual(consola modo texto) no se debe ejecutar GNUscren

----------

## Txema

Bueno pues voy a contribuir yo también ^^

Estos son dos script que hice y llevo usando un tiempo ya, y me pareció que ya iba siendo hora de compartirlos con la comunidad para que pueda usarlos el que quiera  :Wink: 

upgrade (de este he tomado muchas cosas de este mismo foro, como elogv, e incluso el comentario de revdep-rebuild xDD aunque no recuerdo de quien, de alguno de los grandes gurús fue):

```
#!/bin/bash

layman -S

eix-sync

emerge -avuND --keep-going system

emerge -avuND --keep-going world

elogv

env-update && source /etc/profile && cfg-update -u

emerge -a --depclean

revdep-rebuild -p  # En caso de que cante paquetes a recompilar vuelvo a ejecutarlo sin la opción -p

eclean-dist -d
```

Para su correcto funcionamiento requiere elogv, cfg-update, eix, gentoolkit y layman si tenéis overlays, si no comentad la primera línea

KernelInstall (funciona tanto para x86 como para amd64):

```
#!/bin/bash                                     

echo "Selecciona el kernel a compilar:"

echo "-------------------------------------"

echo "`eselect kernel list`"                

echo "-------------------------------------"

echo "[Indique el número o presione enter para seleccionar el actual]"

echo ""                                                               

read LINK                                                             

case "$LINK" in                                                       

        "" )                               

                echo "Kernel ya seleccionado, se continúa el proceso" 

                echo ""                                               

        ;;                                                            

        * )                                                           

                echo "Nuevo kernel seleccionado, se continúa el proceso"

                echo ""                                     

                eselect kernel set $LINK                 

        ;;                          

esac                        

                             

cd /usr/src/linux/           

                                     

echo " ------ Intentando copia de .config de kernel anterior ------ "       

cp /usr/src/linux-`uname -r`/.config /usr/src/linux/                

                                                                          

if [ -s .config ]                                                 

then                                                                  

        echo "Encontrado archivo de configuración .config"       

        echo ""                                        

else                                                

        echo "No hay archivo previo de configuración. Saliendo"      

        echo ""                                                    

        exit                                                

fi                                                          

echo " ------ Configurando Kernel... ------ "

echo ""

make oldconfig

make menuconfig

echo " ------ Compilando Kernel... ------ "

echo ""

make && make modules_install

KERNEL=`ls -l /usr/src/linux|sed 's/^.*linux-//'`

ACTUAL1=`grep -m 1 /kernel /boot/grub/grub.conf|sed 's/^.*\/boot\/kernel-//g'|sed 's/ root.*//g'`

ACTUAL2=`grep /kernel /boot/grub/grub.conf|sed 's/^.*\/boot\/kernel-//g'|sed 's/ root.*//g'|sed 's/ root.*//g'|sed -e '1d'`

echo " ------ Recompilando drivers ------ "

module-rebuild -X rebuild

echo " ------ Copiando nueva imagen a /boot ------ "

echo ""

cp /usr/src/linux/arch/x86/boot/bzImage /boot/kernel-${KERNEL}

echo " ------ Modificando grub ------ "

if [[ $KERNEL != $ACTUAL1 && $KERNEL != $ACTUAL2  ]]

then

        sed -i "s/${ACTUAL1}/borrado/" /boot/grub/grub.conf

        sed -i "s/${ACTUAL2}/${ACTUAL1}/" /boot/grub/grub.conf

        sed -i "s/borrado/${KERNEL}/" /boot/grub/grub.conf

        BORRAR=`ls /boot/kernel*|sed 's/  /\n/g'|sed 's/\/boot\/kernel-//g'`

        for i in $BORRAR

        do

                if [[ $i != $KERNEL && $i != $ACTUAL1 ]]

                then

                        rm /boot/kernel-$i

                fi

        done

elif [[ $KERNEL = $ACTUAL1 ]]

then

        # No se hace nada

        echo "Versión idéntica de kernel, grub.conf no modificado."

elif [[ $KERNEL = $ACTUAL2 ]]

then

        echo "Versión idéntica de kernel, Entrada antigua colocada en primer lugar"

        sed -i "s/${ACTUAL1}/borrado/" /boot/grub/grub.conf

        sed -i "s/${ACTUAL2}/${ACTUAL1}/" /boot/grub/grub.conf

        sed -i "s/borrado/${KERNEL}/" /boot/grub/grub.conf

fi
```

Este último compila un nuevo kernel (o recompila el mismo) y modifica grub para actualizar las entradas, dejando sólo dos, el recién compilado y el anterior.

Seguro que son muy mejorables, pero aquí los dejo para el que quiera echarles un ojo  :Wink: 

Saludos.

----------

## Coghan

Hola @Txema.

He visto tu script para actualizar el sistema, en principio te puedes ahorrar dos líneas:

Layman -S: veo que usas eix-sync para actualizar el árbol de portage, éste también es capaz de actualizar los overlays, simplemente crea el fichero /etc/eix-sync.conf con un asterisco [*] como primera línea. De esta manera eix-sync actualiza primero los overlays y luego el portage oficial y al finalizar realiza un update y lista los ebuilds nuevos de todo el conjunto. En la manpage de eix tienes más ayuda sobre este archivo.

emerge -avuND --keep-going system : también te los puedes ahorar, al actualizar world este también incluirá los ebuild que formen parte de system del perfil que estés usando. Usar sytem puede ser útil por ejemplo al actualizar gcc para dejar sanos los ebuild importantes sin necesidad de pasar por un -e world, o si tienes roto el toolchain y necesitas reparar un sistema mínimo.

----------

## Txema

Muchas gracias por los consejos, el primero no lo conocía y lo pondré en práctica desde ya. El segundo ya lo sabía pero tengo la costumbre de separar el system del world, para asegurarme de que se actualicen los paquetes importantes primero y por si no quiero actualizar world sino sólo system  :Wink: 

Saludos.

----------

## papu

```
#!/bin/bash

layman -S

eix-sync

emerge -avuND --keep-going system

emerge -avuND --keep-going world

elogv

env-update && source /etc/profile && cfg-update -u

emerge -a --depclean

revdep-rebuild -p  # En caso de que cante paquetes a recompilar vuelvo a ejecutarlo sin la opción -p

eclean-dist -d
```

no conocia elogv  ni cfg-update,  elogv exactamente que es lo que hace?ya que no le veo mucha utilidad;   y cfg-update es como un etc-update?

lo que no conocia tampoco eclean-dist -d que limpia /usr/portage/distfiles? es lo mismo que eclean distfiles supongo,   entonces eclean que limpia exactamente?

lo del depclean lo entiendo supongo para mirar si se ve algo que uno mismo sabe que puede quitar, porque ni harto de vino haría un depclean tampoco ( malas experiencias).

saludos, adéu.

----------

## ensarman

eclean-dist -d es la opción para que  limpiar los distfiles, sin -d limpia todo pero deja  las que posiblemente se puedan usar en un futuro, en cambio con la opcion -d activada (destructive) se hace que se eliminen todos los distfiles que menos los que pertencen a los paquetes actualmente instalados

----------

## papu

 *ensarman wrote:*   

> eclean-dist -d es la opción para que  limpiar los distfiles, sin -d limpia todo pero deja  las que posiblemente se puedan usar en un futuro, en cambio con la opcion -d activada (destructive) se hace que se eliminen todos los distfiles que menos los que pertencen a los paquetes actualmente instalados

 

aja es que yo siempre hago  rm *  , he usado eclean-dist -d y no lo vacia :O.

saludos, adéu.

----------

## ensarman

l idea no e svaciar, sino que te quedes con las fuentees de los pauqtess que tienes intalados, para que, si por algun motivo quieres recompilar algo, no tengas que estar descargando denuevo ps, lo veo como un consumo tonto de ancho de banda

----------

## papu

 *ensarman wrote:*   

> l idea no e svaciar, sino que te quedes con las fuentees de los pauqtess que tienes intalados, para que, si por algun motivo quieres recompilar algo, no tengas que estar descargando denuevo ps, lo veo como un consumo tonto de ancho de banda

 

pues mira que tengo paquetes instalados yo, ¿entonces que es lo que borra exactamente? Yo tendría un huevo de cosas ahi ocupando espacio ya que uso paquetes inestables y actualizo a menudo.

tengo 20mb de bajada no me preocupa el hecho de tener que bajar otra vez ya que a parte que va rapido se baja en paralelo a medida compila.

Lo de elogv no le veo utilidad, que hace exactamente? el cfg-update aun no lo ne necesitado parece un etc-update mejorado.

saludos, adéu.

----------

