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 .bashrc
archivo de inicio :
alias petsc="~/petsc-3.2-p6/petsc-arch/bin/mpiexec"
lo que me permite ejecutar este mpiexec
archivo 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 petsc
como 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 mpiexec
archivo, pero es engorroso escribir la ruta completa cada vez que quiero escribir un nuevo script. ¿Hay alguna manera de que pueda usar mi alias petsc
dentro del archivo de script? ¿Hay alguna manera de editar mi .bashrc
o .bash_profile
hacer 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
petsc
es 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_aliases
en 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 tempranoexit
oreturn
, por ejemplo,[ -z "$PS1" ] && return
(verifica si el indicador primario no está configurado para indicar un shell no interactivo) o puede haber un checki
in$-
($-
contiene opciones de shell,i
significa interactivo). Verman bash
para esas variables.Los alias están en desuso a favor de las funciones de shell. Desde la
bash
pá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
mpiexec
lugar depetsc
) Agregue$HOME/petsc-3.2-p6/petsc-arch/bin
a suPATH
variable. Esto se puede hacer editando~/.profile
y agregando:Vuelva a iniciar sesión para aplicar estos cambios
Crea el directorio
~/bin
ycrear un script de envoltorio llamado que
petsc
contenga: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
.bashrc
tambié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,.bashrc
solobash
se almacenan las configuraciones de configuración .En terminal:
source .bash_aliases
petsc arg(s)
Ventaja: no necesita
export -f petsc
en.bash_aliases
. Los alias están en desuso, pero usar las.bash_aliases
funciones está bien.fuente
Entonces, si tiene un archivo llamado
script.sh
con sus comandos que incluyen el uso de alias, simplemente escriba:fuente
.
osource
buiiltin 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.
osource
es 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
"$@"
.