Discussion:
date +%a
(zu alt für eine Antwort)
Jan Novak
2021-03-05 12:26:21 UTC
Permalink
Moin,

auf einem Suse gibt mir heute
LANG=C;date +%a
ein "Fri" aus,
auf einem Debian
ein "Fr".

Laut Manpage ist das tagesdatum bei %a immer 3 Zeichen lang.
Wieso gibt Debian hier nur 2?


Jan
Jan Novak
2021-03-05 12:39:04 UTC
Permalink
Post by Jan Novak
Moin,
auf einem Suse gibt mir heute
LANG=C;date +%a
ein "Fri" aus,
auf einem Debian
ein "Fr".
Laut Manpage ist das tagesdatum bei %a immer 3 Zeichen lang.
Wieso gibt Debian hier nur 2?
Hängt wohl mit dem LC_ALL EInstellungen zusammen. Wenn ich diese auf ""
setze,dann bekomme ich die 3 Buchstaben.
Ich war der Meinung mit prefix LANG=C würde immer die posix Variante
gewählt!?

Jan
Michael Bäuerle
2021-03-05 13:28:11 UTC
Permalink
Post by Jan Novak
Post by Jan Novak
auf einem Suse gibt mir heute
LANG=C;date +%a
ein "Fri" aus,
auf einem Debian
ein "Fr".
Laut Manpage ist das tagesdatum bei %a immer 3 Zeichen lang.
Wieso gibt Debian hier nur 2?
| $ LC_ALL=de_DE.utf8 /bin/date +%a
| Fr
| $ LC_ALL=C /bin/date +%a
| Fri

Wenn du nach dem setzen der Variable ein Semicolon angibst, dann wird
sie hier (ohne "export") nicht verwendet:

| $ LC_ALL=de_DE.utf8 ; /bin/date +%a
| Fri
| $ export LC_ALL=de_DE.utf8 ; /bin/date +%a
| Fr
Post by Jan Novak
Hängt wohl mit dem LC_ALL EInstellungen zusammen. Wenn ich diese auf ""
setze,dann bekomme ich die 3 Buchstaben.
Ich war der Meinung mit prefix LANG=C würde immer die posix Variante
gewählt!?
Nein, das wäre LC_ALL. LANG ist ein Default, der wird nur verwendet wenn
LC_* nicht gesetzt ist.
Michael Bäuerle
2021-03-05 13:30:37 UTC
Permalink
Post by Jan Novak
Post by Jan Novak
auf einem Suse gibt mir heute
LANG=C;date +%a
ein "Fri" aus,
auf einem Debian
ein "Fr".
Laut Manpage ist das tagesdatum bei %a immer 3 Zeichen lang.
Wieso gibt Debian hier nur 2?
| $ LC_ALL=de_DE.utf8 /bin/date +%a
| Fr
| $ LC_ALL=C /bin/date +%a
| Fri

Wenn du nach dem setzen der Variable ein Semikolon angibst, dann wird
sie hier (ohne "export") nicht verwendet:

| $ LC_ALL=de_DE.utf8 ; /bin/date +%a
| Fri
| $ export LC_ALL=de_DE.utf8 ; /bin/date +%a
| Fr
Post by Jan Novak
Hängt wohl mit dem LC_ALL EInstellungen zusammen. Wenn ich diese auf ""
setze,dann bekomme ich die 3 Buchstaben.
Ich war der Meinung mit prefix LANG=C würde immer die posix Variante
gewählt!?
Nein, das wäre LC_ALL. LANG ist ein Default, der wird nur verwendet wenn
LC_* nicht gesetzt ist.
Helmut Waitzmann
2021-03-05 13:39:14 UTC
Permalink
Post by Jan Novak
Post by Jan Novak
auf einem Suse gibt mir heute
LANG=C;date +%a
ein "Fri" aus,
auf einem Debian
ein "Fr".
Laut Manpage ist das tagesdatum bei %a immer 3 Zeichen lang.
Wieso gibt Debian hier nur 2?
Hängt wohl mit dem LC_ALL EInstellungen zusammen. Wenn ich diese
auf "" setze,dann bekomme ich die 3 Buchstaben.
Ich war der Meinung mit prefix LANG=C würde immer die posix
Variante gewählt!?
Nicht immer, denn es gibt die folgenden Regeln: 


Wenn die Umgebungsvariable «LC_ALL» einen nicht‐leeren Wert hat,
werden alle anderen LC_…‐Umgebungsvariablen von ihr überstimmt. 

Für die Ausgabe von Datum und Uhrzeit ist die Umgebungsvariable
«LC_TIME» zuständig. 

Wenn weder «LC_ALL» noch die spezifische LC_…‐Variable einen
nicht‐leeren Inhalt hat, wird in der Umgebungsvariablen «LANG»
nachgesehen, was dort drinsteht. 

Noch ein Tipp:  Das Kommando «locale» gibt verlässlich die
augenblicklichen Locale‐Einstellungen aus. 


Lass also das Kommando


LANG=C; locale; date '+%a'

laufen und schau nach, was dort bei der Kategorie «LC_TIME» steht. 
Prüfe nach, dass das zur Datumsausgabe passt. 
Jan Novak
2021-03-08 09:27:34 UTC
Permalink
Post by Jan Novak
Ich war der Meinung mit prefix LANG=C würde immer die posix Variante
gewählt!?
Wenn die Umgebungsvariable «LC_ALL» einen nicht‐leeren Wert hat, werden
alle anderen LC_…‐Umgebungsvariablen von ihr überstimmt.
"das" wars.... keine Ahnung woher ich das hatte, habe seit jeher LANG
gesetzt. In Zukunft setze ich LC_ALL=C
Lass also das Kommando
  LANG=C; locale; date '+%a'
laufen und schau nach, was dort bei der Kategorie «LC_TIME» steht. Prüfe
nach, dass das zur Datumsausgabe passt.
Die zu erwartende Ausgabe.
Danke für den Tip.

Jan
Marcel Logen
2021-03-05 13:35:02 UTC
Permalink
Post by Jan Novak
auf einem Suse gibt mir heute
LANG=C;date +%a
ein "Fri" aus,
auf einem Debian
ein "Fr".
Laut Manpage ist das tagesdatum bei %a immer 3 Zeichen lang.
| ***@o15:~/ybtra-o15$ LC_MESSAGES=C man date

zeigt mir an:

| %a locale's abbreviated weekday name (e.g., Sun)

Das heißt, der Wert hängt von der locale ab.

Ich habe hier GNU date auf Debian 10:

| ***@o15:~/ybtra-o15$ date --version | head -n 1
| date (GNU coreutils) 8.30
Post by Jan Novak
Wieso gibt Debian hier nur 2?
Laut "LC_MESSAGES=C man 7 locale" ist LC_TIME für die
Datumsformatierung zuständig:

| LC_TIME
| This category governs the formatting
| used for date and time values. [...]

Setze ich (für den date-Befehl) LC_TIME=C, dann bekomme
ich drei Zeichen ("Fri"), mit der deutschen locale nur
zwei ("Fr"):

| ***@o15:~/ybtra-o15$ printf '%s\n' "$LANG"
| de_DE.UTF-8
| ***@o15:~/ybtra-o15$ date +%a
| Fr
| ***@o15:~/ybtra-o15$ LC_TIME=C date +%a
| Fri
| ***@o15:~/ybtra-o15$ locale
| LANG=de_DE.UTF-8
| LANGUAGE=
| LC_CTYPE="de_DE.UTF-8"
| LC_NUMERIC="de_DE.UTF-8"
| LC_TIME="de_DE.UTF-8"
| LC_COLLATE="de_DE.UTF-8"
| LC_MONETARY="de_DE.UTF-8"
| LC_MESSAGES="de_DE.UTF-8"
| LC_PAPER="de_DE.UTF-8"
| LC_NAME="de_DE.UTF-8"
| LC_ADDRESS="de_DE.UTF-8"
| LC_TELEPHONE="de_DE.UTF-8"
| LC_MEASUREMENT="de_DE.UTF-8"
| LC_IDENTIFICATION="de_DE.UTF-8"
| LC_ALL=

Marcel
--
╭──────╮ ╭──────╮ ╭─────
╯ ╰────╮ ╰─╮ ╰──╮ ╭────────╯
╭────╯ ╭─────╮ ╭─────╮ │ ╭───╯ ╭──╮ ╰─╮
╰───────╯ ╰─╯ ╰─╯ ╰─────╯ ╰──────────────╯
j***@schily.net
2021-03-08 12:14:51 UTC
Permalink
Post by Jan Novak
Moin,
auf einem Suse gibt mir heute
LANG=C;date +%a
ein "Fri" aus,
auf einem Debian
ein "Fr".
Es wird dingend davon abgeraten, LANG zu verwenden.

Diese Variable kommt aus den Anfängen der Lokalisierung von SunOS aus der Zeit
um 1986.

LANG ist heute nur noch ein Fallback wird nur dann ausgewertet, wenn keine
passende "moderne" Variable gesetzt
ist.

LC_ALL Überstimmt Alles

LC_* die Restlichen LC_ Variablen sind spezifisch und nur wenn weder
LC_ALL noch die passende spezifische Variable gesetzt ist, wird LANG
verwendet.

Seit 29 Jahren sollte man von einem modernen Betriebssystem erwarten, daß per
Default alle spezifischen LC_ Variable gesetzt sind und LANG daher
bedeutungslos ist.

Wenn LANG einen Einfluß hat, dan gibt es offensichtlich ein Problem in der
Konfiguration der Lokale.
--
EMail:***@schily.net Jörg Schilling D-13353 Berlin
Blog: http://schily.blogspot.com/
URL: http://cdrecord.org/private/ http://sourceforge.net/projects/schilytools/files/
Jan Novak
2021-03-08 12:54:01 UTC
Permalink
Post by j***@schily.net
Post by Jan Novak
Moin,
auf einem Suse gibt mir heute
LANG=C;date +%a
ein "Fri" aus,
auf einem Debian
ein "Fr".
Es wird dingend davon abgeraten, LANG zu verwenden.
Diese Variable kommt aus den Anfängen der Lokalisierung von SunOS aus der Zeit
um 1986.
OK... daher habe ich es wohl auch noch ;-)


Jan
Juergen Ilse
2021-03-08 13:10:41 UTC
Permalink
Hallo,
Post by j***@schily.net
Post by Jan Novak
Moin,
auf einem Suse gibt mir heute
LANG=C;date +%a
ein "Fri" aus,
auf einem Debian
ein "Fr".
Es wird dingend davon abgeraten, LANG zu verwenden.
Das sehe ich ganz und gar nicht so.
Post by j***@schily.net
Diese Variable kommt aus den Anfängen der Lokalisierung von SunOS aus der Zeit
um 1986.
Das aendert nichts an ihrer Nuetzlichkeit.
Post by j***@schily.net
LANG ist heute nur noch ein Fallback wird nur dann ausgewertet, wenn keine
passende "moderne" Variable gesetzt
ist.
Eben. Es ist die Variable, die als "Defaault" fuer alle nicht explizit anders
gesetzten locale-Einstellungen verwendet wird, und ein solcher Defaault ist
sinnvoll, wenn man nicht alle Einstellungen explizit setzen moechte.
Post by j***@schily.net
LC_ALL Überstimmt Alles
Genau, und deswegen ist LC_ALL nicht geeignet, wenn mn mit moeglichst
geringem Aufwaand alle bis auf einige wenige Vaiablen auf einen Defult-
wert setzen moechte, aber die wenigen anderen mittels explizit gesetzter
Werte uebersteuern moechte. Die Funktionlitet von LANG ist mir viel
wichtiger ls die Funktionaalitaet von LC_ALL (mit der alle separat
gesetzten Einstellungen uebersteuert werden).
Post by j***@schily.net
LC_* die Restlichen LC_ Variablen sind spezifisch und nur wenn weder
LC_ALL noch die passende spezifische Variable gesetzt ist, wird LANG
verwendet.
Genau, und das ist eine durchus *sinnvolle* Funktionlitaet, die man
anderweitig nicht so einfach erreichen kann.
Post by j***@schily.net
Seit 29 Jahren sollte man von einem modernen Betriebssystem erwarten, daß per
Default alle spezifischen LC_ Variable gesetzt sind und LANG daher
bedeutungslos ist.
Warum, wenn man ie seelbe Funktionalitaet bei Verwendung von LANG mit
erheblich weniger gesetzten Variablen erzielen kaann?
Post by j***@schily.net
Wenn LANG einen Einfluß hat, dan gibt es offensichtlich ein Problem in der
Konfiguration der Lokale.
LANG ist ein (maanchmal wichtiger) Bestandteil der Konfiguration der locaale.
Die (IMHO GNUR-spezifische) Variable LANGUAGE haalte ich fuer ueberfluessig
wie ein Kropf, LANG haalte ich dagegen fuer durchaus sinnvoll.

Tschuess,
Juergen Ilse (***@usenet-verwaltung.de)
j***@schily.net
2021-03-09 10:20:38 UTC
Permalink
Post by Juergen Ilse
Wenn LANG einen Einfluß hat, dan gibt es offensichtlich ein Problem in der
Konfiguration der Lokale.
LANG ist ein (maanchmal wichtiger) Bestandteil der Konfiguration der locaale.
Die (IMHO GNUR-spezifische) Variable LANGUAGE haalte ich fuer ueberfluessig
wie ein Kropf, LANG haalte ich dagegen fuer durchaus sinnvoll.
Das ist ein komplettes Mißvertändnis.

LANGUAGE hat absolut nichts mit der Lokale zu tun, sondern ist ausschließlich
für das automatische Übersetzungamanagement mittels gettext(3) oder gettext(1)
als Erweiterung der Einstellungen durch LC_MESSAGES zuständig.

Diese Variable wurde vor 20 Jahren in Absprache von Sun und den GNU Leuten
eingeführt um eine alternative Übersetzung zu selektieren. Wenn man z.B.
Italiener ist und weiß, daß es auf dem System häufig keine italienischen
Übersetzungen gibt, aber Deutsch besser verstanden wird als Englisch, dann
kann man LANGUAGE z.B. auf "it:de" stellen und man bekommt italienische Texte
wenn eine italienische Übersetzung für das aktuelle Programm vorliegt, sonst
wird (falls vorhanden) Deutsch verwendet.

Aus der gettext(1) Man Page:

LANGUAGE is a list of locale names separated by a
colon (':') character. If LANGUAGE is
defined, each locale name is tried in the
specified order and if a GNU-compatible
message catalogue is found, the message is
returned. If a GNU-compatible message
catalogue is found but failed to find a
corresponding msgid, the msgid string is
returned. If LANGUAGE is not defined or if
a Solaris message catalogue is found or no
GNU-compatible message catalogue is found
in processing LANGUAGE, the pathname used
to locate the message catalogue is
dirname/locale/category/domainname.mo,
where dirname is the directory specified by
TEXTDOMAINDIR, locale is a locale name, and
category is LC_MESSAGES.

Ein Solaris message Katalog ist dabei ein .mo File, das den 1986-1988
auf SunOS eingeführtem gettext System entspricht. Da braucht man pro
Zeichensatzkodierungs-Variante ein spezielles angepaßtes .mo File.

Ein GNU-compatible message Katalog ist dabei ein .mo File, das folgende
Erweiterungen enthält:

- Eine Mime Header "Übersetzung" für den String "" erlaubt die
automatische Transkodierung zwischen unterschiedlichen
Zeichensätzen (z.B. ISO8859-1 und UTF-8).

- Erweiterungen, die eine automatische Behandlung der Mehrzahl-
Varianten ermöglichen.

Hier wird nur ein .mo File pro Sprache benötigt, da der Zeichensatz im .mo
File automatisch mittels iconv(3) in den aktuell verwendeten Zeichensatz
konvertiert wird.

Das gettext System wird übrigens Bestandteil des nächsten POSIX Standard
werden und cas aktuell standardisierte catgetx(3) ablösen.

Es zeigt nebenbei symptomatisch daß im GNU/Linux Umfeld sich niemand an
Standards hält, selbst wenn diese Standards (wie im Falle von gettext) selbst
(in diesem Fall gemeinsam mit Sun) aufgeschrieben wurden. Von dem gemeinsamen
Sun/GNU Standard für gettext hat Sun nämlich einen sauberen Subset
implementiert aber GNU etwas Anderes und wir kämpfen gerade dafür, daß diese
GNU Fehlimplementierungen repariert werden. Achja, vor einem Jahr habe ich
(gemeinsam mit einem Studenten vom Hasso Platter Institut) das xgettext(1) von
Solaris so erweitert, daß es den vollen Funktionsumfang hat und man damit auf
Solaris auf gxgettext(1) verzichten kann.
--
EMail:***@schily.net Jörg Schilling D-13353 Berlin
Blog: http://schily.blogspot.com/
URL: http://cdrecord.org/private/ http://sourceforge.net/projects/schilytools/files/
Andreas Kohlbach
2021-03-08 16:34:00 UTC
Permalink
Post by j***@schily.net
Post by Jan Novak
Moin,
auf einem Suse gibt mir heute
LANG=C;date +%a
ein "Fri" aus,
auf einem Debian
ein "Fr".
Es wird dingend davon abgeraten, LANG zu verwenden.
Diese Variable kommt aus den Anfängen der Lokalisierung von SunOS aus der Zeit
um 1986.
LANG ist heute nur noch ein Fallback wird nur dann ausgewertet, wenn keine
passende "moderne" Variable gesetzt
ist.
LC_ALL Überstimmt Alles
LC_* die Restlichen LC_ Variablen sind spezifisch und nur wenn weder
LC_ALL noch die passende spezifische Variable gesetzt ist, wird LANG
verwendet.
Mist, ich dachte immer, LC_ALL wäre Fallback. Werde es nie lernen. :-(
--
Andreas
Lesen Sie weiter auf narkive:
Loading...