Bash, Variablenlänge

Guten Tag,

ich möchte ein kleines bash-Skript schreiben, dass Dateien auf mehrere Server kopiert. Syntax soll sein wie bei ls oder rm

syncfiles FILE...

wobei FILE einen kompletten Pfad beinhalten kann und auch für mehrere Dateien steht. Also beispielsweise für drei Dateien:

syncfiles /web/www80/easy.living.com/easyconf/ini/easy.ini /web/www80/easy.living.com/easy/conf/gif/easy.gif /web/www80/easy.living.com/easy/conf/css/easy.css

Das Skript syncfiles liest einfach $* ein und arbeitet dann über eine Schleife die übergebene Liste ab (siehe Skriptentwurf unten)

Meine Fragen dazu:
Gibt es eine maximale Variablengröße in bash? - ich kann nichts dazu finden. Und gibt es eine maximale Parameterlänge, die ich einem bash-Script übergeben kann? Also: wieviele Zeichen kann ich dem Skript übergeben?

Verwendung finden wird das Skript auf RHAS 3 und RHAS 4.

Scriptentwurf (völlig simpel, ich habs hier einfach hingetippt, Fehler sind zu entschuldigen):

for SERVER in $ADDRESSES; do
 for FILE in $\*; do
 scp $FILE $USER@$SERVER:blush:FILE
 done
done

Danke,
Stefan

Moin,

Gibt es eine maximale Variablengröße in bash? - ich kann
nichts dazu finden. Und gibt es eine maximale Parameterlänge,
die ich einem bash-Script übergeben kann? Also: wieviele
Zeichen kann ich dem Skript übergeben?

zunächst mal dürfte bei „sowas“ dieser Artikel interessant sein: http://www.linux-mag.com/content/view/839/43/ Da geht es zwar nur um die Anzahl der Argumente und nicht um die Länge, aber das betrifft Dich ja trotzdem.

Was nun die Länge angeht (die kannst Du auch mit xargs erschlagen, aber ich antworte trotzdem mal), so kannst Du diesen Wert mit dem Befehl

getconf ARG_MAX

herausfinden. Bei mir auf FreeBSD/bash sind das 64k, ist wohl aber vom Kernel abhängig und nicht von der Shell.

Eventuell ist dieser Thread hier auch interessant:
http://groups.google.de/group/comp.unix.questions/br…

Sorry, was konkreteres hab ich grad nicht parat, aber wie gesagt, xargs ist ohnehin Dein Freund.

Gruß,

Malte.

Hi!

Es gibt definitiv eine maximale Länge der Kommandozeilenargumente. Das betrifft aber nur alle zusammen. Du kannst also locker 1 langes Argument haben oder viele kürzere. Nur die Summe zählt.

BTW: Linux (und alle anderen Betriebssysteme) haben eine maximale Länge, die ein Dateiname samt Pfad haben darf, siehe PATH_MAX in linux/limits.h.

Falls die Liste der Dateinamen zu lang wird, kannst du ja von Kommandozeilenargumenten zu stdin übergehen, einfach ein Dateiname je Zeile. Dann schaut deine Schleife so aus:

while read FILE ; do
 scp $FILE $USER@$SERVER:blush:FILE
done

getconf ARG_MAX

Danke, damit kann ich eine Menge anfangen. Bei mir (Redhat Linux AS3 und AS4) sind es 128k, die übergeben werden können. Das ist erst einmal deutlich mehr, als ich erwartet habe und zweitens kann ich damit eine Abbruchbedingung programmieren.

Sorry, was konkreteres hab ich grad nicht parat, aber wie
gesagt, xargs ist ohnehin Dein Freund.

Das ist alles konkret genug. Als ich 1991 mit Unix begann, gab es IMHO xargs noch nicht, so dass mir viel moderner Schnickschnack :wink: nicht bekannt ist - die heutige Beschäftigung mit xargs war eine Bereicherung.

Gruß,
Stefan

xargs

getconf ARG_MAX

Danke, damit kann ich eine Menge anfangen. Bei mir (Redhat
Linux AS3 und AS4) sind es 128k, die übergeben werden können.
Das ist erst einmal deutlich mehr, als ich erwartet habe und
zweitens kann ich damit eine Abbruchbedingung programmieren.

Sorry, was konkreteres hab ich grad nicht parat, aber wie
gesagt, xargs ist ohnehin Dein Freund.

Das ist alles konkret genug. Als ich 1991 mit Unix begann, gab
es IMHO xargs noch nicht, so dass mir viel moderner
Schnickschnack :wink: nicht bekannt ist - die heutige
Beschäftigung mit xargs war eine Bereicherung.

Also bei mir sagt die man-Page dazu

XARGS(1) NetBSD General Commands Manual XARGS(1)

NAME
 xargs -- construct argument list(s) and execute utility

(...)

HISTORY
 The xargs command appeared in PWB Unix 1.0. It made its first BSD
 appearance in the 4.3 Reno release.

PWB UNIX ist das „Programmer’s Workbench UNIX“, dessen Version 1.0 auf UNIX Version 6 basierte, das muß also so um 1976 herum gewesen sein :wink: In SunOS 4.1.3 (1989) war’s jedenfalls auch schon mit drin *ggg*

Gruß,

malte

PWB UNIX ist das „Programmer’s Workbench UNIX“, dessen Version
1.0 auf UNIX Version 6 basierte, das muß also so um 1976 herum
gewesen sein :wink: In SunOS 4.1.3 (1989) war’s jedenfalls auch
schon mit drin *ggg*

Dann kann es nur noch daran liegen, dass ich die Unix-Kommandos nur bis „w“ ausprobiert habe :wink:

Stefan

PWB UNIX ist das „Programmer’s Workbench UNIX“, dessen Version
1.0 auf UNIX Version 6 basierte, das muß also so um 1976 herum
gewesen sein :wink: In SunOS 4.1.3 (1989) war’s jedenfalls auch
schon mit drin *ggg*

Dann kann es nur noch daran liegen, dass ich die
Unix-Kommandos nur bis „w“ ausprobiert habe :wink:

Das ist schlüssig. Alles, was mit „x“ anfängt, steht ja auch erstmal im Verdacht, nicht konsolenfähig zu sein, und alles mit „y“ („Yet another…“) ist auch per se erstmal lame :wink:
Interessant: Die PWB Shell ist der Vorgänger der Bourne Shell ist der Vorgänger der bash.

Gruß,

Malte

Alles, was mit „x“ anfängt, steht ja auch
erstmal im Verdacht, nicht konsolenfähig zu sein,

Ich hab auch lange gebraucht, bis ich spitzgekriegt hab, das klog kein syslog fuer KDE ist…

und alles
mit „y“ („Yet another…“) ist auch per se erstmal lame :wink:

Yap.

Interessant: Die PWB Shell ist der Vorgänger der Bourne Shell
ist der Vorgänger der bash.

Ich wurde vor kurzem mal wieder mit einer ksh konfrontiert. Ich zitere jetzt noch. Oder auch die Antwort auf die Frage eines Freundes „Wie aktiviert man in der tcsh eigentlich die History?“: „Indem man bash eingibt.“

Gruss vom Frank.