Ich habe einen Ordner und eine Datei in meinem Home-Verzeichnis mit dieser Struktur: ~/folder/file
.
Sowohl Ordner als auch Datei haben von mir volle Berechtigungen erhalten (Ordner ist 700, Datei ist 600). Der folgende Testbefehl (er befindet sich in einem Shell-Skript, falls das wichtig ist) gibt unerwartet (meiner Meinung nach) „false“ zurück.
[ -r ~/folder/file ]
echo $? #Prints 1->Failure
Wenn ich jedoch einen alternativen Pfad zur Datei verwende, wie
pwd #Prints /home/myname
[ -r /home/myname/folder/file ]
[ -r folder/file ]
echo $? #Prints 0->Success
Übersehe ich etwas?
test -r
Gibt „true“ zurück, wenn FILE
vorhanden und die Leseberechtigung gemäß erteilt ist
man test
.
Antwort1
Ich habe mein Problem schließlich gefunden. Die Sache ist, dass ich den Pfad über die Tastatur eingelesen habe (Befehl „read“) und die Tilde (~) irgendwie nicht erweitert wurde. Die Lösung hierfür war:
echo 'Give path:'
read var1
var2=$(eval echo "$var1");
Jetzt enthält var2 den vollständigen Pfad (mit Erweiterung des ~) und ich kann meine Tests danach normal verwenden.
Antwort2
Zur ErgänzungAlators Antwort, Es ist darauf hinzuweisen, dassTilde-Erweiterungwird nur in diesen Fällen durchgeführt:
- Variablenzuweisung, ohne Anführungszeichen
~
unmittelbar nach:
, wie inmypath=~/Documents:~/usr/share/stuff
- Variablenzuweisung nach dem ersten
=
,~
ohne Anführungszeichen, wie infoo=~/bar
- Anfang eines "Wortes":
~/ascript.sh
- Separates "Wort":
stat ~/afile.txt
read
übernimmt die wörtliche Zeichenfolge stdin
und führt keine Tilde-Erweiterung durch; wichtiger noch, die Tilde-Erweiterung wird von der Shell selbst durchgeführt und nicht von ihren einzelnen integrierten Befehlen.
Eine Möglichkeit, damit umzugehen, könnte über das erfolgen, eval
was Alator gezeigt hat, oder man könnte die Parametersubstitution nutzen (was technisch gesehen nur eine manuelle Möglichkeit ist, genau dasselbe zu tun):
~$ echo "${foo/\~/$HOME}"
/home/username/Documents
Alternativ können Sie Python und Perl wie folgt verwenden, wenn es Ihnen nichts ausmacht, einen anderen Prozess zu starten (oder Sie mit diesen bestimmten Sprachen zu tun haben):
python -c 'import sys,os; print os.path.expanduser(sys.argv[1])' "$foo"
perl -e 'print glob qq("$ARGV[0]")' "$foo" "$foo"