Verständnisproblem bei Variablendeklaration in Skript

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Mäuseturm
Beiträge: 53
Registriert: 02.12.2007 11:40:05
Wohnort: Rheinland-Pfalz

Verständnisproblem bei Variablendeklaration in Skript

Beitrag von Mäuseturm » 30.06.2016 12:53:57

Hallo bash-Kenner,

ich habe da mal eine kleine Kuriosität, bei der ich nicht ganz durchblicke.

Ich habe ein bash-Skript, das das Abbyy OCR Commandline Tool aufruft, um gerade eingescannte PDFs in durchsuchbare PDF/A zu konvertieren. Dieses Skript kann ich manuell aufrufen oder aber es wird von Samba über das root postexec Kommando in der smb.conf aufgerufen, sobald mein Scanner das PDF auf einer entsprechenden Freigabe abgelegt hat.

Rufe ich das Skript manuell auf, ist alles gut. Ruft Samba das Skript auf, fehlen so einige Umgebungsvariablen. Das Abbyy OCR CLI motzt dann, dass die LANG-Variable nicht gesetzt sei. Das ist beim Aufruf über Samba auch tatsächlich der Fall.

Ok, ist ja eigentlich kein Problem. Also das Skript fix um die Kleinigkeit erweitert...

Code: Alles auswählen

#!/bin/bash
...
LANG=de_DE.UTF-8
/usr/local/bin/abbyyocr11 ....
...und gewundert, dass das OCR-Tool trotzdem noch die angeblich fehlende LANG-Variable anmeckert. Wenn ich aber den Tool-Aufruf direkt hinter die Variablendeklaration packe...

Code: Alles auswählen

#!/bin/bash
...
LANG=de_DE.UTF-8 /usr/local/bin/abbyyocr11 ....
...dann ist das OCR-Tool zufrieden.

Nur was ist denn da technisch gesehen der Unterschied?

Benutzeravatar
Meillo
Moderator
Beiträge: 9232
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Verständnisproblem bei Variablendeklaration in Skript

Beitrag von Meillo » 30.06.2016 15:10:10

Mäuseturm hat geschrieben: Nur was ist denn da technisch gesehen der Unterschied?
Ersteres setzt eine Variable fuer den aktuellen Prozess. Zweiteres setzt eine Umgebungsvariable fuer den Kindprozess.

Wenn du vor die erste Variante ein ``export'' setzst, dann setzt du eine Umgebungsvariable, die an Kindprozesse vererbt wird. Das scheint mir dasjenige zu sein, was du suchst.
Use ed once in a while!

tobo
Beiträge: 2339
Registriert: 10.12.2008 10:51:41

Re: Verständnisproblem bei Variablendeklaration in Skript

Beitrag von tobo » 30.06.2016 15:35:15

Mäuseturm hat geschrieben:Nur was ist denn da technisch gesehen der Unterschied?
Grundsätzlicher Unterschied ist, dass im 2. Beispiel LANG nur für diese eine Zeile gilt, im 1. Beispiel für alles was danach kommt. Technisch gesehen - bezogen auf den Aufruf von abby... - sollte es keinen Unterschied machen. LANG wird als Environment-Variable der Bash automatisch durch diese exportiert und somit sollten beide Fälle identisch sein. Wäre LANG einfach nur eine normale Variable, dann müsstest du diese im ersten Beispiel exportieren, damit du für den Funktionsaufruf gleiches Verhalten zum 2. Beispiel herstellst.

Wenn du jetzt sagst, das Skript von Hand gestartet funktioniert, das 2 Beispiel funktionert ebenfalls und das erste Beispiel ohne export funktioniert nicht, dann müsste man schlussfolgern, dass in deiner aktuell offenen und aufrufenden Shell LANG keine Environment-Variable eben dieser Shell ist. Kann aber eigentlich nicht gut sein!?

Benutzeravatar
Meillo
Moderator
Beiträge: 9232
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Verständnisproblem bei Variablendeklaration in Skript

Beitrag von Meillo » 30.06.2016 19:35:24

tobo hat geschrieben:LANG wird als Environment-Variable der Bash automatisch durch diese exportiert
Nicht von der Bash automatisch, nur wenn das in einer profile-Datei oder so gesetzt ist.
Manpage der bash hat geschrieben: The following variables are used by the shell. In some
cases, bash assigns a default value to a variable; these
cases are noted below.
...
LANG Used to determine the locale category for any cat‐
egory not specifically selected with a variable
starting with LC_.
tobo hat geschrieben:[...] dann müsste man schlussfolgern, dass in deiner aktuell offenen und aufrufenden Shell LANG keine Environment-Variable eben dieser Shell ist. Kann aber eigentlich nicht gut sein!?
Ist eher unueblich, aber genau so denke ich, dass die Situation liegt. Kann man ja einfach rausfinden:

Code: Alles auswählen

env | grep ^LANG
Use ed once in a while!

Antworten