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?

shybash. Leeré sobre eso. Si puede molestarse en hacer su comentario en una respuesta, lo marcaré como correcto.#!/usr/bin/env bashcomo 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, ...).bashTambién se puede considerar una implementación desh(ver más abajo).Debido a que
shes una especificación, no una implementación,/bin/shes un enlace simbólico (o un enlace duro) a una implementación real en la mayoría de los sistemas POSIX.¿Qué es bash?
bashcomenzó como unashimplementació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, porbashlo que no es un shell POSIX válido. Más bien, es un dialecto del lenguaje de shell POSIX.bashadmite un--posixconmutador, lo que lo hace más compatible con POSIX. También intenta imitar POSIX si se invoca comosh.sh = bash?
Durante mucho tiempo,
/bin/shsolía apuntar a la/bin/bashmayorí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/shque no apunta/bin/bash(y en algunos de los cuales/bin/bashpueden no existir) son:shdedashforma predeterminada;initramfs. Utiliza laashimplementación de shell.pdksh, un descendiente del shell Korn. FreeBSDshes un descendiente del shell original Bourne de UNIX. Solaris tiene la suyashque durante mucho tiempo no fue compatible con POSIX; Se encuentra disponible una implementación gratuita del proyecto Heirloom .¿Cómo puede averiguar qué
/bin/shpuntos de su sistema?La complicación es que
/bin/shpodrí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
-Lbandera cubre tanto enlaces simbólicos como enlaces duros, pero la desventaja de este método es que no es portátil: POSIX no requierefindadmitir la-samefileopció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/bashsi 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
shpor las siguientes razones:bash, deben tenershHay ventajas de usar
bashtambié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. Plainshes un lenguaje de programación muy minimalista.fuente
/bin/shhecho 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/bashfuente