2017-07-07 2 views
1

Ich habe ein sehr überraschendes Problem beim Versuch, einen diff Befehl in einem Bash-Skript auszuführen.bash diff kann keine vorhandenen Dateien finden, wenn eine Pfadvariable mit Tilde (~) bereitgestellt wird

Hier ist ein Arbeitscode veranschaulicht den Punkt:

#!/bin/bash 
cd 
mkdir foo bar 
head -c 1024 /dev/urandom >foo/qux 
head -c 1024 /dev/urandom >bar/qux 

# works properly as expected 
diff ~/{foo,bar}/qux 

folder="~" 

# this fails with the ~ inside a variable 
diff $folder/{foo,bar}/qux 

# cleaning the mess 
rm -rf foo bar 

Also meine Frage ist:

Warum? :-)

Antwort

1

Geben Sie ~ nicht an, wenn Sie es einer Variablen zuweisen. Die ~ wird nur um bash erweitert, wenn Sie nicht angeben.

+0

hahaha :) Vielen Dank –

1

~ ist eine Funktion der Shell-Erweiterung.
doppelte Anführungszeichen begrenzen die Erweiterung auf drei Merkmale:

  1. Befehl Substitution: $ (Befehl ...) | `command ...`
  2. Variablensubstitution: $ VAR | $ {VAR}
  3. Arithmetik: $ ((2 + 2))
+0

Dies bedeutet nicht unbedingt erklären, warum '$ folder' (unquoted) nicht die Tilde erweitern. – chepner

+0

Was meinst du? Bitte geben Sie ein Beispiel. – hedgar2017

0

Tilde Erweiterung gilt nur für nicht notierte Tilden. Die Tilde muss zu dem Zeitpunkt erweitert werden, an dem Sie die Zuweisung an vornehmen, da die Tilde-Erweiterung nicht auf Parametererweiterungen angewendet wird, sondern nur auf Wortteilung und Pfadnamenerweiterung.

folder=~ # ~ is expanded, and the result is assigned to folder 
Verwandte Themen