Analysieren Sie eine `.hidden`-Datei, um deren Inhalt aus `ls` auszuschließen.

Analysieren Sie eine `.hidden`-Datei, um deren Inhalt aus `ls` auszuschließen.

Ich möchte, dass lsalle in einer .hiddenDatei aufgeführten Dateinamen ignoriert (aus der Ausgabe weggelassen) werden.

lsIch habe eine Bash-Funktion gefunden, die dies scheinbar überschreibt ...

ls () {
  if [ -f .hidden ]; then
    declare GLOBIGNORE="$GLOBIGNORE:.*:$(tr '\n' ':' < .hidden)"
    ls "$@"
  fi
}

...aber wenn ich source .bashrces zurückbringe

-bash: .bashrc: line 121: syntax error near unexpected token `('
-bash: .bashrc: line 121: `ls () {'

Ich kann den Syntaxfehler selbst nicht identifizieren (ich habe ein wenig Bash-Skripting gemacht, aber die declare GLOBIGNOREZeile ist mir fremd). Zeile 121 ist nur dies: ls () {was selbst in Ordnung zu sein scheint.

Sehen Sie einen Fehler in dieser Funktion?

Gibt es einen anderen Ansatz, der verwendet werden könnte?


Aktualisierung:

Das Löschen des alias ls='ls --color=auto'Formulars .bashrcbehebt den unexpected tokenFehler nicht. Wie empfohlen, verzichten wir auf diesen Ansatz mit globignore.

-IAls @rkhff auf das (und ) hinwies, --ignore=kam mir die Idee, so etwas auszuprobieren (zuerst in einer Funktion, bevor ich es in bashrc einfüge)

PARAM=''
if [ -f .hidden ]; then
  IGN=' -I '
  while read p; do
    $PARAM+=$IGN$p
    #$PARAM="${PARAM}${IGN}${p}"
  done < .hidden
fi
ls$PARAM

aber das ergibt auf mysteriöse Weise Folgendes /home/alec/bin/ls.sh: line 7: +=: command not found... warum konnte es nicht +=gefunden werden? Ich habe bei meinen Websuchen keine anderen Fälle gesehen, in denen der +=Operator „Befehl nicht gefunden“ ergibt. Die kommentierte Zeile mit nur dem =erzeugt ebenfalls einen Fehler „Befehl nicht gefunden“. Kann jemand sagen, was die Ursache dafür sein könnte?

Antwort1

Der Fehler liegt wahrscheinlich daran, dass Sie eine früherealiasDefinition für ls. Zur Demonstration:

$ alias foo='echo foobar'
$ foo
foobar
$ foo () { echo barfoo; }
-bash: syntax error near unexpected token `('

Jedoch, ich glaube nicht, dass Sie damit machen können, was Sie wollen GLOBIGNORE, da es nur beeinflusst, wie dieHülseerweitert Globs, und Ihre Shell erweitert alle Glob-AusdrückeVorIhr lsBefehl wird aufgerufen.

Zumindest mit der GNU Coreutils-Implementierung von lskönnen Sie jedoch möglicherweise den Schalter -Ioder verwenden, z. B.--ignore

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

verwandte Informationen