- Lua ofereix lleugeresa, portabilitat i control avançat (corutines, funcions de primera classe) davant de l'enfocament d'orquestració de Bash.
- Bash brilla en pipes i utilitats POSIX; Lua destaca quan la lògica és complexa o multiplataforma.
- Mako Server i luash amplien Lua per a automatització pràctica (os.execute, io.popen) sense perdre senzillesa.
- Errors com exit 127 solen ser àlies/paths incoherents; verifica amb type -ai rutes absolutes.

L'automatització i l'scripting són el pa de cada dia en sistemes Unix i derivats però també en entorns mixtos amb Windows. La comparació eterna entre Bash i Lua sorgeix quan busquem equilibri entre rapidesa, portabilitat i facilitat de manteniment.
A partir del que mostren les fonts més ben posicionades —articles que posen Lua com a alternativa versàtil a Bash , guies pràctiques amb Mako Server, debats en fòrums i opinions pro‑Bash—, ordenarem idees, baixarem a exemples i assenyalarem trampes comunes com el temut exit 127 en invocar Lua des de Bash a Windows. També donarem context amb referències a altres llenguatges que apareixen a les fonts (JavaScript, Python, Node.js, HTML5, PHP) ia l'habitual avís de galetes de Reddit que molts veuen en obrir fils.
Què són Bash i Lua
En poques paraules, Bash (Bourne Again SHell) és l'intèrpret d'ordres per excel·lència de sistemes Unix-like: interpreta ordres, orquestra utilitats i permet encadenar processos mitjançant canonades i redireccions. El seu objectiu central és ser un intèrpret potent d'ordres amb una capa de programació per combinar-les.
Lua és un llenguatge lleuger, ràpid i embebible, multiplataforma i amb sintaxi neta. El seu disseny minimalista us permet executar-se en recursos limitats i dins d'aplicacions (motors de joc, eines de xarxa, servidors embeguts), oferint estructures de control modernes i un únic tipus de dades compost: la taula.
- xoc: ideal per a processament de text, manipulació de fitxers i administració del sistema aprofitant tot l'ecosistema d'utilitats POSIX.
- lua: llenguatge de propòsit general i embebible; ofereix més expressivitat i control per a lògica complexa, mantenint una empremta petita i gran portabilitat.
Diferències clau per a scripting i automatització
Diverses peces del rànquing insisteixen en això: Lua destaca per lleugeresa i velocitat . El vostre VM és compacte i l'intèrpret arrenca ràpid, cosa que s'agraeix en scripts que s'executen moltes vegades o en entorns encastats.
La portabilitat és un altre punt fort. Lua no està lligat a Unix : corre sense problemes a Linux, macOS i Windows, minimitzant ifs per plataforma. Bash, encara que usable a Windows via emulacions (Git Bash, WSL), depèn més d'eines POSIX i matisos de l'entorn.
Pel que fa a expressivitat, Lua ofereix funcions de primera classe , corutines i metatables. Aquestes peces permeten construir solucions més àmplies sense recórrer a utilitats externes, mentre que a Bash és habitual compondre la solució amb set, awk, grep, find, etc. Bash brilla precisament en aquest ecosistema i en el treball amb canonades.
Aprenentatge i llegibilitat
Diverses guies assenyalen que la sintaxi de Lua s'assembla al pseudocodi , cosa que ajuda a principiants. Bash, en canvi, té regles de cometes, expansió i substitució que poden sorprendre. Dos exemples equivalents (bucle de l'1 al 5):
# Bash
#!/usr/bin/env bash
for i in {1..5}; do
echo 'Hola, mundo '"$i"
done
-- Lua
for i = 1, 5 do
print('Hola, mundo ' .. i)
end
La versió a Lua resulta directa i menys propensa a errors per quoting o expansió rara. A Bash, dominar quan fer servir cometes simples/dobles i com s'expandeixen variables o claus és crucial.
Característiques avançades de Lua per a automatització
Funcions de primera classe : s'emmagatzemen en variables, es passen com a arguments i es tornen; afavoreixen la modularitat i reutilització en automatitzacions de mitjana/alta complexitat.
Corutines : faciliten tasques concurrents no bloquejants sense bregar amb fils del SO. Molt útils per coordinar fluxos (per exemple, diverses feines d'E/S) sense complexitat addicional.
Metatables i metamètodes : permeten redefinir el comportament d'operacions sobre taules, estenent el llenguatge per adaptar-lo al domini del problema.
Un exemple simple i molt citat en articles: processament darxius línia a línia a Lua, de forma concisa i clara:
-- Lua: leer y procesar un archivo línea a línea
local function procesar(archivo)
local f = io.open(archivo, 'r')
for linea in f:lines() do
print('Procesando: ' .. linea)
end
f:close()
end
procesar('ejemplo.txt')
Aquest patró mostra com Lua combina I/O senzill amb claredat ; és fàcil estendre'l per parsejar, filtrar o comunicar-te amb altres components.
Lua a la pràctica: Mako Server per a scripts moderns
Una de les guies més ben valorades proposa utilitzar Mako Server per ampliar Lua amb APIs orientades a automatització (incloent-hi xarxa), reduint dependència de paquets externs. El shebang típic seria:
#!/usr/bin/env mako
print('Hola Lua!')
Instal·lació a Linux x86‑64 (segons tutorial): ràpida i sense complicacions.
cd /tmp
wget makoserver.net/download/mako.linux-x64.tar.gz
tar xvzf mako.linux-x64.tar.gz
sudo cp mako mako.zip /usr/local/bin/
Un cop instal·lat, l'script s'executa amb normalitat i aprofita les API extra de Mako. Per exemple, crear rutes i llistar contingut amb trucades al sistema:
#!/usr/bin/env mako
os.execute('mkdir -p api/os api/fs')
os.execute('ls -lh api')
Si necessiteu funcionalitats de Bash (p. ex., expansió de claus), podeu invocar-lo des de Lua i mantenir l'ergonomia:
#!/usr/bin/env mako
local function ex(cmd)
-- Usa bash como login shell y escapa el comando
return os.execute('/bin/bash -lc ' .. string.format('%q', cmd))
end
ex('mkdir -p api/{os,fs}')
ex('ls -lh api')
Per capturar sortida estàndard (i no només el codi de sortida), io.popen és molt útil. Un patró comú és obtenir versions de binaris:
#!/usr/bin/env mako
local function ex(cmd)
local p = io.popen(cmd)
local out = p:read('*a') or ''
p:close()
return (out:gsub('%s+$',''))
end
local function version(s)
return s:match('([%d]+%.[%d]+%.[%d]+)')
end
local nodev = version(ex('node --version'))
print('node version\t' .. (nodev or 'not installed'))
local wgetv = version(ex('wget -V'))
print('wget version\t' .. (wgetv or 'not installed'))
Així construeixes revisions de dependència simples sense sortir de Lua, mantenint un flux clar i portable.
Paquets externs amb Mako: exemple amb luash
Una altra recomanació popular és luash , una llibreria lleugera que simplifica llançar ordres del sistema des de Lua amb una API que recorda a l'intèrpret d'ordres. Instal·lació típica :
git clone https://github.com/zserge/luash.git
sudo mkdir -p /usr/local/share/lua/5.4/
sudo cp luash/sh.lua /usr/local/share/lua/5.4/
Un guió curt que llista el directori actual quedaria així, barrejant Lua idiomàtic amb trucades tipus shell:
#!/usr/bin/env mako
require('sh')
local cwd = tostring(pwd())
print('Files in ' .. cwd)
local listing = tostring(ls('.'))
for f in listing:gmatch('[^\n]+') do
print(f)
end
La idea és minimitzar cola manual quan el que vols és invocar eines externes i processar resultats amb la comoditat de Lua.
Bash o Lua? Criteris pràctics d'elecció
Una opinió recurrent en fòrums és que criticar Bash per no ser un llenguatge generalista és perdre el focus. Bash està pensat com a intèrpret de comandes per compondre utilitats del sistema; el seu llenguatge serveix per enganxar-les entre si amb canonades o IPC.
Si la teva feina és molt de consola, uses pipes anònims, redireccions, grep/sed/awk diàriament i la teva lògica és menor que l'orquestració externa, Bash segueix sent la millor navalla suïssa. No competeix contra Lua com a llenguatge de propòsit general; compon ordres com ningú.
Si el vostre cas requereix control de flux elaborat , transformació de dades, corutines o portabilitat estricta (Linux/macOS/Windows) sense dependre d'utilitats POSIX, Lua dóna una experiència més còmoda que evita el mal de quoting i expansions complexes.
També convé recordar l'ecosistema: amb Bash pots estirar tot l'univers utils (coreutils, binutils, util‑linux…). I si trobes a faltar estructures de dades específiques, hi ha eines com a recutils que complementen el model textual tradicional.
Diagnòstic d'errors habituals: el cas de l'èxit 127
En un fil popular, en executar un script com a bash bb.sh apareixia un codi de sortida 127 després d'intentar lua -e 'print hha' , mentre que amb source bb.sh tot anava bé. A POSIX, 127 significa “ command not found ”.
Si lua està mapejat a una altra cosa (per exemple, al fil es veia lua is aliased to `lua53` ), potser en llançar un nou procés amb bash aquesta àlies o ruta no existeixi o apunti a un binari no present al PATH efectiu d'aquest subshell, provocant el 127.
En entorns Windows amb Git Bash hi entra un altre factor: des de cmd.exe és habitual definir doskey (p. ex., doskey lua=lua53 $* ). Si la sessió de Git Bash hereta alguna cosa de l'entorn que resol llua a lua53 , però en aquest subshell no hi ha lua53 o la vostra ruta, obtindreu 127; en fer source , en canvi, s'usa l'intèrpret d'ordres actual amb el seu propi PATH/alias i pot funcionar.
# Comprobar resolución del binario
type -a lua
# Sugerencias:
# 1) Invocar la ruta absoluta: /usr/local/bin/lua o /c/Program Files/lua/lua
# 2) Desactivar alias: unalias lua; o usa 'command lua' para saltarte funciones/alias
# 3) Limpia el hash de rutas en bash: hash -r
# 4) Revisa PATH en el subshell que crea 'bash bb.sh'
La solució en el cas del fil va ser treure el doskey lua=lua53 $* en cmd, i després bash lua va tornar a comportar-se normal. Moraleja: si veus un sospitós 127 , revisa àlies, funcions de shell i PATH; i verifica amb type -a o command -v quin binari s'està intentant executar realment.
Context: altres llenguatges i eines que treuen el cap a les fonts
Als resultats apareixen descripcions sobre JavaScript (no només en navegador, també Node.js/Apache CouchDB) i Python (sintaxi clara, generalista). Aquests llenguatges solen competir pel buit de l'scripting d'automatització en equips que vénen del costat del desenvolupament.
Node.js ofereix un runtime amb I/O no bloquejant pensat per a temps real, mentre HTML5 i PHP treuen el cap com a peces històriques del desenvolupament web en algunes pàgines indexades. No són rivals directes de Bash o Lua en administració de sistemes, però sí alternatives per a automatitzacions multiplataforma.
En debats s'esmenten utilitats modernes de Python com uv per resoldre dependències sense muntar projectes pesats, o shells alternatius com a xonsh (Python‑powered), a més d'opcions com Racket, D en mode script o OCaml. La conclusió pràctica : tria l'eina en funció del cas i la fricció del teu equip amb cada ecosistema.
Convé recordar que plataformes socials com Reddit interposen avisos de privadesa i cookies abans de veure el contingut; no afecta la tècnica, però explica perquè a vegades no es carreguen els fils sense acceptar l'avís.
Si necessites scripts que funcionin igual a Linux, macOS i Windows, amb lògica rica, proves i execucions veloces , Lua és una gran candidata. Si orquestraràs utilitats POSIX, enganxar eines amb canonades i fer glue scripting amb mínima fricció, Bash segueix sent insuperable. La bona notícia és que no són excloents: combinar Lua (o Lua+Mako) per a la part “lògica” i Bash per al “shell glue” et deixa amb el millor dels dos mons.