Tengo este script de shell guardado en un archivo: realiza una sustitución básica de cadenas.
#!/bin/sh
html_file=$1
echo "html_file = $html_file"
substr=.pdf
pdf_file="${html_file/.html/.pdf}"
echo "pdf_file = $pdf_file"
Si lo pego en la línea de comando, funciona bien:
$ html_file="/home/max/for_pauld/test_no_base64.html"
echo "html_file = $html_file"
substr=.pdf
pdf_file="${html_file/.html/.pdf}"
echo "pdf_file = $pdf_file"
da
html_file = /home/max/for_pauld/test_no_base64.html
pdf_file = /home/max/for_pauld/test_no_base64.pdf
Esa es la salida del eco anterior: funciona según lo previsto.
Pero cuando llamo el guión, con
$ saucer "/home/max/for_pauld/test_no_base64.html"
Me sale esta salida:
html_file = /home/max/for_pauld/test_no_base64.html
/home/max/bin/saucer: 5: /home/max/bin/saucer: Bad substitution
¿Mi script usa una versión diferente de bash o algo así? ¿Necesito cambiar mi línea shebang?
sh
ybash
. Leeré sobre eso. Si puede molestarse en hacer su comentario en una respuesta, lo marcaré como correcto.#!/usr/bin/env bash
como su shebang, y use sustituciones definidas posixly como desee, pero con advertencias de portabilidad. Y lea: unix.stackexchange.com/a/48787/27616Respuestas:
Que es sh
sh
(o el lenguaje de comandos de Shell) es un lenguaje de programación descrito por el estándar POSIX . Tiene muchas implementaciones (ksh88
,dash
, ...).bash
También se puede considerar una implementación desh
(ver más abajo).Debido a que
sh
es una especificación, no una implementación,/bin/sh
es un enlace simbólico (o un enlace duro) a una implementación real en la mayoría de los sistemas POSIX.¿Qué es bash?
bash
comenzó como unash
implementación compatible (aunque es anterior al estándar POSIX por algunos años), pero con el paso del tiempo ha adquirido muchas extensiones. Muchas de estas extensiones pueden cambiar el comportamiento de los scripts de shell POSIX válidos, porbash
lo que no es un shell POSIX válido. Más bien, es un dialecto del lenguaje de shell POSIX.bash
admite un--posix
conmutador, lo que lo hace más compatible con POSIX. También intenta imitar POSIX si se invoca comosh
.sh = bash?
Durante mucho tiempo,
/bin/sh
solía apuntar a la/bin/bash
mayoría de los sistemas GNU / Linux. Como resultado, casi se había vuelto seguro ignorar la diferencia entre los dos. Pero eso comenzó a cambiar recientemente.Algunos ejemplos populares de sistemas a los
/bin/sh
que no apunta/bin/bash
(y en algunos de los cuales/bin/bash
pueden no existir) son:sh
dedash
forma predeterminada;initramfs
. Utiliza laash
implementación de shell.pdksh
, un descendiente del shell Korn. FreeBSDsh
es un descendiente del shell original Bourne de UNIX. Solaris tiene la suyash
que durante mucho tiempo no fue compatible con POSIX; Se encuentra disponible una implementación gratuita del proyecto Heirloom .¿Cómo puede averiguar qué
/bin/sh
puntos de su sistema?La complicación es que
/bin/sh
podría ser un enlace simbólico o un enlace duro. Si es un enlace simbólico, una forma portátil de resolverlo es:Si es un enlace duro, intente
De hecho, la
-L
bandera cubre tanto enlaces simbólicos como enlaces duros, pero la desventaja de este método es que no es portátil: POSIX no requierefind
admitir la-samefile
opción, aunque tanto GNU find como FreeBSD encuentran que lo admiten.Línea Shebang
En última instancia, depende de usted decidir cuál usar, escribiendo la línea «shebang».
P.ej
usará
sh
(y lo que sea que apunte),usará
/bin/bash
si está disponible (y fallará con un mensaje de error si no lo está). Por supuesto, también puede especificar otra implementación, por ejemploCual usar
Para mis propios guiones, prefiero
sh
por las siguientes razones:bash
, deben tenersh
Hay ventajas de usar
bash
también. Sus características hacen que la programación sea más conveniente y similar a la programación en otros lenguajes de programación modernos. Estos incluyen cosas como variables locales localizadas y matrices. Plainsh
es un lenguaje de programación muy minimalista.fuente
/bin/sh
hecho es un enlace simbólico/bin/dash
.Además de la excelente respuesta de @ Hunter.S.Thompson, me gustaría señalar que la parte no portátil del guión es
El
${variable/search/replace}
es una extensión de GNU. Pero puede evitarlo fácilmente con POSIX puro:Después de Hunter, esta es la mejor solución que cambiar el shebang a
#! /bin/bash
fuente