Portál AbcLinuxu, 10. května 2025 11:11
"cat /etc/passwd | grep ^[^:]*:[^:]*:[^:]*|cut -f 1 -d ":""je nesmysl, to se expanduje na ten řetězec v uvozovkách, měls asi na mysli $(...) nebo `...`, i tak by to moc nefungovalo. No nic, nejlepší co jsem vymyslel je
if cut -d: -f1 | grep -F -x -q "$1"; then echo "OK" else echo "neexistuje" finajdi si v man grep co ty optiony znamenají (btw asi nebudou přenositelné) Aby to bylo skutečně korektní, tak by to chtělo C prográmek, co zavolá
getpwnam(argv[1])
.
#!/usr/bin/env python import pwd user = 'all' if (cmp(user,'all')): try: print pwd.getpwnam(user) except KeyError: print "Tento uzivatel neexistuje" else: print "Tohle se tyka vsech uzivatelu"Odteďka chci mít všude login "all"
if egrep -q "^${1}:" /etc/passwd || [ "x$1" = xall ]; then echo OK else echo chyba fi
x=`echo "$1" | LC_CTYPE=C tr -cd '[a-zA-Z0-9_]'` if [ "x$1" != "x$x" ]; echo "Nech toho, darebáku, sic ti hnáty zpřerážím!" # :-) exit 1 fi
Na druhou stranu, kdyby si s tím člověk trochu pohrál, mohl by v tom být i určitý záměr: mohl by se zadávat regulární výraz a hledaly by se procesy kteréhokoli uživatele, který mu vyhovuje (nebo co to měl ten skript dělat)… :-)
test "x$param" = "xvalue" ^ ^? Používá to i Autoconf, takže asi existoval systém, kde nefungoval
test
s prázdným parametrem, ale netuším jaký (PDP-11 ve škole nemáme test
. Nějak se mi ale nedaří vyrobit nějaký dostatečně úderný příklad ('test -e = -f
' i 'test -e = -e
' mi kupodivu fungují správně s interním i externím test
em).
$ uname -srv IRIX64 6.5 04091957 $ /usr/bin/test -n = blabla; echo $? 0Takže smysl to asi má pořád.
To se nám to krásně zjednodušilo. Až na ten fork, fork, exec a přitom je to úplně zbytečné.x=`echo "$1" | LC_CTYPE=C tr -cd '[a-zA-Z0-9_]'` if [ "x$1" != "x$x" ]; echo "Nech toho, darebáku, sic ti hnáty zpřerážím!" # :-) exit 1 fi
case "$1" in *[^a-zA-Z0-9_]*) echo "Nech toho, darebáku, sic ti hnáty zpřerážím!" #To je ekvivalent uvedeného, ale víc jak 20x rychlejší. Nechce hledat přesné omezení na username abych to napsal přesněji.exit 1;; esac
[[ "$1" == *[^a-zA-Z0-9_]* ]] && { echo "Nech toho, darebáku, sic ti hnáty zpřerážím!" #exit 1 }
if ! id "$1" >&/dev/null && [ "x$1" != xall ] then echo "Zadali jste uzivatele, ktery neexistuje, tudiz nespustil zadne procesy" exit 1 fiP.S.: Ano, opravdu tam má být
&&
a ne ||
protože chyba nastane, když uživatel není a zároveň není zadáno all.
$ finger chroustal; echo $? finger: chroustal: no such user. 0
~$1
, ale když jsem zjistil, že pořadí expanzí je opačné, než bych potřeboval, opustil jsem tuto cestu a vrhnul se na parsování /etc/passwd
. Na druhou stranu, v praxi bych to asi stejně radši napsal v céčku…
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.