2016-08-10 5 views
-1

Ich möchte das formatierte Datum in einer Variablen speichern und dieses Format jedes Mal verwenden. zum Beispiel:Bash: Speichern des Datumsformats in Variable (selbstevaluierende Env-Variablen)

export MYDATE=$(date +%m%d%Y) 
    mkdir myfolder_$MYDATE 

aber im obigen Fall MyDate wird nur einmal mit dem aktuellen Datum ausgewertet. Stattdessen möchte ich jedes Mal, wenn ich $ MYDATE (jedesmal wie exec) aufrufe, das späteste Datum abrufen. Ich versuchte auch mit

 export MYDATE='$(date +%m%d%Y)' 

, aber das ist nicht nützlich.

Noch einmal, ich möchte nicht versuchen, Aliase oder bash-Funktionen und dies mit bash Umgebungsvariablen zu erreichen.

Irgendwelche Vorschläge oder Ideen?

Antwort

1

Ich empfehle eine Funktion zu verwenden:

function mydate(){ 
    date +%m%d%Y 
} 

Dann command substitution verwenden Sie den Wert in einen String interpolieren:

mkdir "foo_$(mydate)" 

Btw, können Sie die Funktion zur Verfügung Unterschalen mit machen:

export -f mydate 

Imo das ist der sauberste Weg.

1

In Bash 4.3 (aktuelle Version) und früher wird eine Umgebungsvariable einmal berechnet, als Zeichenfolge gespeichert (exportiert oder nicht), und diese Zeichenfolge wird immer dann abgerufen, wenn auf die Variable verwiesen wird. Um jedes Mal eine aktualisierte Zeichenfolge zu erhalten, gibt es keine andere Möglichkeit, als einen Alias ​​oder eine Funktion zu verwenden, von der Sie zu wissen scheinen.

A hacky Weise Variablen zu aktualisieren wäre es in $PROMPT_COMMAND zu tun, z.B .:

PROMPT_COMMAND='MYDATE=$(date +%m%d%Y)' 

Allerdings würde dies nur jedes Mal laufen die Aufforderung neu gezeichnet wird.

+0

stimme ich zu. Ich dachte, wenn wir Exec oder Eval Anweisungen innerhalb der Definition der Variablen verwenden können, so dass es jedes Mal, wenn die Variable erweitert wird, eval ist. etwas wie: MYDATE = 'eval $ (Datum +% m% d% Y)' –

+0

Ich habe auch von indirekter Expansion mit bash Variablen gehört. Nicht sicher, ob das hier angewendet werden kann. Wenn nicht, kann dies als Erweiterung zur Bash vorgeschlagen werden? –

+0

Wie @chepner vorschlägt, ist eine Version in Arbeit. Aber warum keine Funktionen? –

1

In bash 4.4 (noch nicht erschienen), werden Sie in der Lage sein, so etwas zu tun:

$ mydate="\D{%m%d%Y %T}" 
$ echo "${[email protected]}" 
08102016 12:22:02 
# wait a few seconds 
$ echo "${[email protected]}" 
08102016 12:22:05 

Wenn mydate erweitert wird, werden alle Eingabeaufforderung Escape-Sequenzen im Wert erweitert werden, als ob Sie eine Anzeige prompt. Dies bietet keine Möglichkeit, beliebigen Code auszuführen, sondern deckt zumindest den Anwendungsfall in Ihrer Frage ab.

+0

Das ist interessant. Gut zu hören 4.4 befasst sich mit etwas, das damit zusammenhängt. Ich sehe 4.4 Beta steht zum Download bereit. werde es versuchen. –