
Quiero ls
ignorar (omitir de su salida) todos y cada uno de los nombres de archivo que figuran en un .hidden
archivo.
Encontré una función bash que parece anularse ls
para hacer esto...
ls () {
if [ -f .hidden ]; then
declare GLOBIGNORE="$GLOBIGNORE:.*:$(tr '\n' ':' < .hidden)"
ls "$@"
fi
}
...pero cuando source .bashrc
regresa
-bash: .bashrc: line 121: syntax error near unexpected token `('
-bash: .bashrc: line 121: `ls () {'
No puedo identificar el error de sintaxis por mí mismo (he hecho un pequeño script bash, pero la declare GLOBIGNORE
línea me resulta extraña). La línea 121 es solo esto: ls () {
lo cual parece estar bien en sí mismo.
¿Ves un error en esta función?
¿Existe otro enfoque que podría utilizarse?
actualizaciones:
Eliminar el alias ls='ls --color=auto'
de .bashrc
no resuelve el unexpected token
error. Siguiendo el consejo, abandonemos ese enfoque usando globignore.
Cuando @rkhff señaló -I
(y --ignore=
) se me ocurrió probar algo como esto (primero en una función antes de colocarla en bashrc)
PARAM=''
if [ -f .hidden ]; then
IGN=' -I '
while read p; do
$PARAM+=$IGN$p
#$PARAM="${PARAM}${IGN}${p}"
done < .hidden
fi
ls$PARAM
pero eso da esto misteriosamente /home/alec/bin/ls.sh: line 7: +=: command not found
.... ¿por qué no se pudo +=
encontrar? No he visto ningún otro caso en mis búsquedas web en el que el +=
operador dé como resultado "comando no encontrado". La línea comentada con solo =
también produce un error de comando no encontrado. ¿Alguien podría decir qué podría estar causando esto?
Respuesta1
Es probable que el error se deba a que tienes una versión anterior.aliasdefinición para ls
. Demostrar:
$ alias foo='echo foobar'
$ foo
foobar
$ foo () { echo barfoo; }
-bash: syntax error near unexpected token `('
Sin embargo, no creo que puedas hacer lo que quieras con GLOBIGNORE
, ya que solo afecta la forma en quecaparazónexpande globos, y su shell expandirá cualquier expresión globantesls
se invoca tu comando.
Al menos con la implementación GNU Coreutils de ls
, es posible que pueda utilizar -I
o --ignore
cambiar ex.
hidls ()
{
declare -a args;
local pat;
local patfile=".hidden";
[[ -r $patfile ]] || {
command ls "$@";
return
};
while IFS= read -r pat; do
args+=("-I");
args+=("$pat");
done < "$patfile";
command ls "${args[@]}" "$@"
}
alias ls=hidls