So exportieren Sie eine Variable, die einen Punkt enthält. Ich erhalte einen ungültigen Variablennamen, als ich versuchte:
export my.home=/tmp/someDir
-ksh: my.home=/tmp/someDir: invalid variable name
Auch das Entweichen von Metazeichen (.) Hilft nicht weiter
$ export my\.home=/tmp/someDir
export: my.home=/tmp/someDir: is not an identifier
shell
environment-variables
ksh
user1587504
quelle
quelle
Antworten:
Zumindest für
bash
die Manpage definiert man die Exportsyntax als:Es definiert auch einen "Namen" als:
Daher können Sie eine Variable wirklich nicht definieren,
my.home
da es sich nicht um einen gültigen Bezeichner handelt.Ich bin mir sehr sicher, dass Ihre ksh eine sehr ähnliche Definition eines Bezeichners hat und daher auch diese Art von Variablen nicht zulässt. (Schauen Sie sich die Manpage an.)
Ich bin mir auch sehr sicher, dass es eine Art allgemeinen Standard (POSIX?) Gibt, der angibt, was als Bezeichner (und daher als Variablenname) zulässig ist.
Wenn Sie diese Art von Variable aus irgendeinem Grund wirklich brauchen, können Sie so etwas verwenden
es trotzdem zu definieren. Andererseits können Sie mit der normalen Shell-Syntax nicht darauf zugreifen. In diesem Fall benötigen Sie wahrscheinlich eine andere Sprache wie Perl:
Beispielsweise
sollte Ihren Pfad drucken.
quelle
ANT_OPTS
oder von ~ / .antrc konfiguriert. Keine Notwendigkeit für seltsame Umgebungsvariablennamen für ant selbst.Während Umgebungsvariablen einer beliebigen Namen (einschließlich dem leeren String) hat nicht ein Gleichheitszeichen oder einen Null - Byte enthält, Karte shells Umgebungsvariablen Variablen und in den meisten Muscheln, Variablennamen in ASCII - alphanumerischen Zeichen und begrenzt sind , Shell ,
_
wo das erste Zeichen kann‘ t sein eine Ziffer ( mit Ausnahme der Positionsparameter und andere besondere diejenigen wie$*
,$-
,$@
, ..., (die nicht zu den entsprechenden Umgebungsvariablen abgebildet werden)). Beachten Sie auch, dass einige Variablen von / für die Shell reserviert / speziell sind .Ausnahmen davon:
Die
rc
Schale und seine Derivate wiees
undakanga
unterstützen einen beliebigen Namen außer den leeren String, und diejenigen , die alle numerischen sind oder enthalten=
Zeichen (und immer alle ihre Variablen in die Umgebung zu exportieren, und passen Sie von speziellen Variablen wie*
,status
,pid
...):Es verwendet jedoch eine eigene Codierung für Variablen, deren Name keine Alarme enthält, oder für Arrays, die in der Umgebung von Befehlen übergeben werden, die ausgeführt werden:
AT & T
ksh
,yash
undzsh
(auch ,bash
aber nur für Single-Byte - Zeichen) Unterstützung alnums in den aktuellen Locale, nicht nur ASCII diejenigen.In diesen Shells können Sie das Gebietsschema so ändern, dass die meisten Zeichen als Alpha betrachtet werden. Bei ASCII-Zeichen wie z
.
. Sie können täuschenzsh
oderksh
denken, dass£
es sich um einen Buchstaben handelt, aber nicht um dieses.
oder ein anderes ASCII-Zeichen (wenn es darum geht, Zeichen in Variablennamen zuzulassen, beispielsweise nicht für den[[:alpha:]]
Glob).ksh93
hat spezielle Variablen, deren Name einen Punkt wie enthält${.sh.version}
, aber diese sind nicht Umgebungsvariablen zugeordnet und sind speziell. Das.
ist um sicherzustellen , dass es nicht mit anderen Variablen in Konflikt geraten. Wenn es sich dafür entschieden hätte, es aufzurufen$sh_version
, könnte es möglicherweise Skripte beschädigt haben, die diese Variable bereits verwendet haben (siehe zum Beispiel, wiezsh
Probleme mit ihren$path
oder$commands
speziellen Array- / Hash-Variablen (a la csh) auftreten, die einige Skripte beschädigen).Beachten Sie, dass zusätzlich zu den Schalen nicht diese Variablen, einige Shells wie pdksh Stütz- / mksh tun entfernen sie aus der Umgebung , die sie erhalten (
bash
entfernt die man mit einem leeren Namenash
,ksh
undbash
diese Umgebung Strings entfernen, die keine enthalten=
Zeichen):Um es zusammenzufassen, ist am besten mit Variablennamen von den meisten Schalen unterstützt zu halten und versuchen , auch Großbuchstaben für Umgebungsvariablen zu verwenden (und Kleinschreibung oder gemischter Fall für nicht-exportierte Shell - Variablen) vermieden werden diejenigen , die in Schalen speziell sind (wie
IFS
,PS1
,BASH_VERSION
...).Wenn Sie eine solche Variable in einer Shell festlegen müssen, die sie nicht unterstützt, aber nicht verwirft, können Sie sie entweder selbst erneut ausführen.
(Wenn Sie dies in der Mitte des Skripts tun müssen, hilft das natürlich nicht weiter. Sie können sich jedoch diesen Ansatz ansehen , um die Shell-Ausführungsumgebung über eine erneute Ausführung zu speichern und wiederherzustellen.) Oder probieren Sie den Debugger-Ansatz:
(dass man Arbeit scheint mit
zsh
,yash
,csh
undtcsh
auf Linux amd64, aber nicht mit einer der anderen Shells ich versuchte (mksh
,ksh93
,bash
,dash
)).quelle
mksh
(undpdksh
) konstruieren Sie tatsächlich die Umgebungsprozesse, die sie erzeugen, komplett neu, indem Sie nur die Parameter verwenden, die in der aktuellen Shell-Ausführungsumgebung exportiert wurden. Es gibt also keine Möglichkeit, diese Variablen durch diese Shells zu leiten. (Beachten Sie, dass die Variablen , die sind vergangen sind Änderungen vorbehalten, zB ich plane zu Unterstützung Array Exporte fürmksh
einige Tage.)Wie in den anderen Beiträgen bereits erwähnt, können in den gängigsten Shells keine Umgebungsvariablen mit Punkten im Namen festgelegt werden. Ich habe jedoch Situationen festgestellt, die insbesondere Docker und aufgerufene Programme betrafen, in denen die Software Schlüsselwerte mit Punkten erforderte.
In jeder dieser Situationen können diese Schlüssel-Wert-Paare jedoch nicht nur über Umgebungsvariablen an das Programm übergeben werden. In Ant können Sie beispielsweise "-propertyfile (filename)" verwenden, um eine mit einer Eigenschaftendatei formatierte Auflistung von Schlüsselwerten zu übergeben. Confd erlaubt "-backend file -file (yaml file)".
Ich habe die Umgebungsvariablen in der Form "C__any_value = 'my.property.key = the value'" übergeben. Ich habe dann den Programmaufruf gewechselt, um zuerst die Datei zu generieren:
Der
set
Befehl in Borne Shell gibt jede Eigenschaft in einer separaten Zeile im Formular ausDer
awk
Befehl verarbeitet nur die Umgebungsvariablen, die mit beginnenC__
, und extrahiert dann die in den einfachen Anführungszeichen enthaltenen Werte.Bei dieser Methode muss der Wert der Umgebungsvariablen in der für das Verarbeitungsprogramm erforderlichen Form festgelegt werden. Wenn Ihr Eigenschaftswert oder Schlüssel einfache Anführungszeichen enthält, müssen Sie das awk-Feldtrennzeichen in etwas ändern, von dem Sie wissen, dass es nicht angezeigt wird, und den Wert mit diesem Zeichen umgeben. Zum Beispiel
%
als Trennzeichen verwenden:(Die genaue Ausgabe hängt von Ihrer Shell ab.) Sie müssen zusätzliche Schritte ausführen, um das entstehende Anführungszeichen zu decodieren.
quelle