Estoy trabajando en una serie de líneas de comando para crear archivos, establecer variables y demás en sistemas Linux. No puedo decir qué shell se usará realmente durante la ejecución, pero sé que será csh, tcsh, sh, ksh o bash.
Mi problema principal en este punto es que csh y tcsh no son compatibles con Bourne, ya que usan diferentes comandos/sintaxis para establecer variables y expresiones condicionales.
Simplemente podría crear un script de shell con un shebang para cambiar a /bin/sh si es seguro asumir que está presente.
Por lo tanto, me pregunto: ¿es seguro asumir que sh está instalado y disponible o existe otra forma más elegante de manejar los diferentes estilos de shell sin crear scripts separados?
Es seguro asumir que hay un sh en los sistemas compatibles con POSIX, pero su ruta puede variar. La especificación de Open Group dice que se determine la ubicación de la utilidad sh estándar con:
command -v shAsí que podrías hacer algo como:
"`command -v sh`" <<EOS echo my super sh script EOSPero hay un problema: csh no es compatible con heredocs citados , lo que hará que el proceso de escribir el script sea un verdadero fastidio.
Como apunta a Linux, puede escribir directamente un script sh y usar el shebang #!/bin/sh o #!/usr/bin/env sh .
Tenga en cuenta que las variables establecidas en el script no estarán disponibles para el shell principal. Para eso, necesita source el script, en cuyo caso la sintaxis importará y tendrá que escribir al menos las versiones sh y csh del mismo.