Tengo un archivo ejecutable mpiexec, cuya ruta completa es ~/petsc-3.2-p6/petsc-arch/bin/mpiexec. Como quiero ejecutar este comando en diferentes directorios (sin tener que volver a escribir la ruta completa), configuro un alias en mi .bashrcarchivo de inicio :
alias petsc="~/petsc-3.2-p6/petsc-arch/bin/mpiexec"
lo que me permite ejecutar este mpiexecarchivo en el símbolo del sistema fácilmente escribiendo:
petsc myexecutable
Traté de escribir un archivo de script de shell, llamado script, usando mi nuevo alias petsccomo comando. Después de otorgarle a mi script de shell los permisos apropiados (usando chmod), intenté ejecutar el script. Sin embargo, me dio el siguiente error:
./script: line 1: petsc: command not found
Sé que podría escribir la ruta completa al mpiexecarchivo, pero es engorroso escribir la ruta completa cada vez que quiero escribir un nuevo script. ¿Hay alguna manera de que pueda usar mi alias petscdentro del archivo de script? ¿Hay alguna manera de editar mi .bashrco .bash_profilehacer que esto suceda?

.bash_aliases? Además, ¿qué tal aliasing la ruta absoluta en lugar de la ruta relativa comoalias petsc='/home/user/petsc-3.2-p6/petsc-arch/bin/mpiexec'Respuestas:
En su script de shell, use la ruta completa en lugar de un alias.
En su script de shell, establezca una sintaxis diferente y variable
Usa una función en tu script. Probablemente mejor si
petsces complejoBusca tus alias
Probablemente no desee obtener su fuente
.bashrc, por lo tanto, en mi opinión, uno de los primeros 3 sería mejor.fuente
shopt -s expand_aliasesen el mismo script.|. Aquí, useshopt -s expand_aliases& alias local, por ejemploalias myalias='echo abc|rev', requiere un salto de línea antes del uso (vea ALIAS enman bash). Punto 4: el archivo de origen puede evitar la ejecución no interactiva, es decir, en un script. Busque tempranoexitoreturn, por ejemplo,[ -z "$PS1" ] && return(verifica si el indicador primario no está configurado para indicar un shell no interactivo) o puede haber un checkiin$-($-contiene opciones de shell,isignifica interactivo). Verman bashpara esas variables.Los alias están en desuso a favor de las funciones de shell. Desde la
bashpágina del manual:Para crear una función y exportarla a subcapas, coloque lo siguiente en su
~/.bashrc:Entonces puedes llamar libremente a tu comando desde tus scripts.
fuente
"$@"solo para manejar argumentos.Las funciones y los alias de Shell están limitados al shell y no funcionan en scripts de shell ejecutados. Alternativas para su caso:
(si no se molesta en usar en
mpiexeclugar depetsc) Agregue$HOME/petsc-3.2-p6/petsc-arch/bina suPATHvariable. Esto se puede hacer editando~/.profiley agregando:Vuelva a iniciar sesión para aplicar estos cambios
Crea el directorio
~/binycrear un script de envoltorio llamado que
petsccontenga:Si el programa lo permite, puede omitir el shellscript y crear un enlace simbólico con el comando:
fuente
En bash 4 se puede utilizar variable especial:
$BASH_ALIASES.Por ejemplo:
Alternativamente, defínalo como variable y luego usa la sustitución de comandos o
eval.Entonces, por ejemplo, en lugar de definir el alias como:
definirlo como:
en lugar. Luego ejecútelo:
o:
fuente
${BASH_ALIASES[alias]}es una buena opción. De lo contrario, tuve que editar muchas líneas de mis .bash_aliases para aplicar otras cosas. Gracias.Puede forzar a bash a ejecutar su script como un shell interactivo con el indicador -i. Esto le indicará a su archivo .bashrc que defina alias y otras funciones.
Ejemplo:
Más información:
fuente
.bashrctambién se lee durante la ejecución de comandos SSH no interactivos (es por eso que tiene una verificación de interactividad en la parte superior)Entonces, la respuesta real a esta pregunta, para aquellos que buscan usar alias reales en scripts de shell en lugar de alternativas a ellos, es:
En cuanto a por qué me gustaría hacer esto: debido a circunstancias inusuales, necesito engañar a un Dockerfile para que piense que es un script de shell.
fuente
En
.bash_aliases:O poner la función en
.bashrc. Por lo general,.bashrcsolobashse almacenan las configuraciones de configuración .En terminal:
source .bash_aliasespetsc arg(s)Ventaja: no necesita
export -f petscen.bash_aliases. Los alias están en desuso, pero usar las.bash_aliasesfunciones está bien.fuente
Entonces, si tiene un archivo llamado
script.shcon sus comandos que incluyen el uso de alias, simplemente escriba:fuente
.osourcebuiiltin hace que el shell actual ejecute todos los comandos en él. Si se produciría la expansión de alias en la cáscara en la que.osourcees ejecutado, se produce. Sin embargo, es importante darse cuenta de que este método solo es útil algunas veces, porque a menudo uno necesita o quiere ejecutar un script en su propio shell, con su propio entorno. Las secuencias de comandos de Shell escritas con la intención de ejecutarse de la manera habitual generalmente no deben obtenerse en su lugar; a menudo no funcionan correctamente.(EDITAR: funciones eliminadas ya que leí mal la llamada de mpiexec.)
Si lo único que necesita es escribir menos, ¿por qué no coloca la carpeta en $ PATH? ¿O hacer un enlace simbólico a mpiexec desde alguna carpeta en $ PATH? ¿O (mi favorito) pone el alias en un script que usted obtiene en el script de llamada?
fuente
"$@".