$file Het script werkt niet; het geeft me deze foutmelding: ./tester.sh: line 4: ~/Desktop/test.txt: No such file or directory Wat doe ik"> $file Het script werkt niet; het geeft me deze foutmelding: ./tester.sh: line 4: ~/Desktop/test.txt: No such file or directory Wat doe ik"> $file Het script werkt niet; het geeft me deze foutmelding: ./tester.sh: line 4: ~/Desktop/test.txt: No such file or directory Wat doe ik" />

"~/Desktop/test.txt: geen bestand of map"

Ik heb dit script geschreven:

#!/bin/bash

file="~/Desktop/test.txt"
echo "TESTING" > $file

Het script werkt niet; het geeft me deze foutmelding:

./tester.sh: line 4: ~/Desktop/test.txt: No such file or directory

Wat doe ik verkeerd?

34
Ik heb de titel gewijzigd om het meer beschrijvend te maken.
toegevoegd de auteur Michael Hoffman, de bron
toegevoegd de auteur codeforester, de bron

2 antwoord

Vervang ~ door $ HOME . Tilde-expansie gebeurt alleen wanneer de tilde niet wordt vermeld. Zie info "(bash) Tilde Expansion" .

Je zou ook file = ~/Desktop kunnen doen zonder het te citeren, maar als je ooit een deel hiervan vervangt door iets met een veldscheidingsteken erin, dan zal het breken. Het citeren van de waarden van variabelen is waarschijnlijk een goede zaak om er toch een gewoonte van te maken. Het citeren van de variabele file = ~/"Desktop" werkt ook, maar ik vind dat nogal lelijk.

Een andere reden om $ HOME de voorkeur te geven, indien mogelijk: tilde-uitbreiding gebeurt alleen bij het begin van woorden. Dus opdracht --option = ~/foo werkt alleen als opdracht tilde-uitbreiding zelf uitvoert, wat per opdracht kan verschillen, terwijl opdracht --option = "$ HOME/foo " werkt altijd.

55
toegevoegd
Wauw, dat werkte! Hoe komt dat dat werkt en mijn script niet?
toegevoegd de auteur Mason, de bron
Bijgewerkt antwoord.
toegevoegd de auteur Michael Hoffman, de bron
@Mason - ook de tilde-uitbreiding gebeurt vóór de variabele uitbreiding, dus wanneer $ file wordt geconverteerd naar ~/Desktop/test.txt heb de uitbreidingsfase van tilde al gemist. Zie gnu.org/software/bash/manual/bashref.html # Shell-uitbreidingen voor de volgorde van uitbreiding.
toegevoegd de auteur Stephen P, de bron

Ter info, je kunt ook eval gebruiken:

eval "echo "TESTING" > $file"

De eval neemt de opdracht als een argument en zorgt ervoor dat de shell de Tilde-uitbreiding .

1
toegevoegd