
Ich möchte, dass ls
alle in einer .hidden
Datei aufgeführten Dateinamen ignoriert (aus der Ausgabe weggelassen) werden.
ls
Ich 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 .bashrc
es 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 GLOBIGNORE
Zeile 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 .bashrc
behebt den unexpected token
Fehler nicht. Wie empfohlen, verzichten wir auf diesen Ansatz mit globignore.
-I
Als @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 ls
Befehl wird aufgerufen.
Zumindest mit der GNU Coreutils-Implementierung von ls
können Sie jedoch möglicherweise den Schalter -I
oder 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