Testbefehl: Lesbarkeitstest schlägt fehl

Testbefehl: Lesbarkeitstest schlägt fehl

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 -rGibt „true“ zurück, wenn FILEvorhanden 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 stdinund 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, evalwas 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"

verwandte Informationen