Muy a menudo, el script que quiero ejecutar no se encuentra en mi directorio de trabajo actual y realmente no quiero dejarlo.
¿Es una buena práctica ejecutar scripts (BASH, Perl, etc.) desde otro directorio? ¿Por lo general encontrarán todas las cosas que necesitan para funcionar correctamente?
Si es así, ¿cuál es la mejor manera de ejecutar un script "distante"? Lo es
. /path/to/script
o
sh /path/to/script
y como usar sudo
en tales casos? Esto, por ejemplo, no funciona:
sudo . /path/to/script
. /path/to/script
fuentes del guión! No necesita el período en absoluto si solo desea ejecutarlo.Respuestas:
sh / path / to / script generará un nuevo shell y ejecutará un script independiente de su shell actual. El
source
comando (.) Llamará a todos los comandos del script en el shell actual. Si el script llama,exit
por ejemplo, perderá el shell actual. Debido a esto, generalmente es más seguro llamar scripts en un shell separado con sh o ejecutarlos como archivos binarios usando la ruta completa (comenzando con /) o relativa (./). Si se llama como binarios, se ejecutarán con el intérprete especificado (#! / Bin / bash, por ejemplo).En cuanto a saber si un script encontrará o no los archivos que necesita, no hay una buena respuesta, aparte de mirar el script para ver qué hace. Como opción, siempre puede ir a la carpeta del script en un subproceso sin salir de su carpeta actual:
fuente
(cd /wherever/ ; sh script.sh)
? ¿Por qué tienes un$
frente?Definitivamente puedes hacer eso (con los ajustes que los otros mencionaron como
sudo sh /pathto/script.sh
o./script.sh
). Sin embargo, hago una de las pocas cosas para ejecutarlos en todo el sistema para no preocuparme por los directorios y ahorrarme tipeo adicional inútil.1) Enlace simbólico a
/usr/bin
(asegúrese de que no haya nombres superpuestos allí, porque obviamente lo anularía). Esto también me permite mantenerlos en mis carpetas de desarrollo para que pueda ajustarlos según sea necesario.
2) Agregue el directorio Scripts a su ruta (usando .bash_profile - o lo que sea. Perfil que tiene en su shell)
PATH=/path/to/scripts/:$PATH
3) Crear alias en el complemento
.bash_profile
de~/.bash_profile
agregar algo como:Como puede ver, la sintaxis es solo un alias, dígitos que desea que actúen como un comando, el comando. Por lo tanto, escribir "l" en cualquier lugar del terminal daría como resultado
ls -l
Si desea sudo, soloalias sl="sudo ls -l"
para tener en cuenta l vs sl (como un ejemplo inútil).De cualquier manera, puede escribir
sudo nameofscript
y seguir su camino. No es necesario meterse con ./ o. o sh, etc. Simplemente márquelos como ejecutables primero: Dfuente
Usualmente me gusta como dices
Y para ejecutarlo como root / superusuario
Su directorio actual solo importa si los scripts asumen que está en la misma carpeta que él. Supongo que la mayoría de los scripts no hacen esto y está guardado para ejecutarlo como se indica arriba.
fuente
Usualmente mantengo mis scripts en
/usr/local/bin
o/usr/local/sbin/
(si el script necesita privilegios de root) donde, de acuerdo con el Estándar de Jerarquía del Sistema de Archivos (FHS), pertenecen.Todo lo que tiene que hacer es asegurarse de que estos dos directorios se agreguen a su
PATH
. Puede hacer esto editando su$HOME/.bashrc
archivo y agregando esta línea:Si desea poder ejecutar un script como root vía
sudo
, debe agregar estos directorios a la variablesecure_path
en su/etc/sudoers
.La edición de este archivo se realiza ejecutando, lo
visudo
que garantiza que no tenga ningún error.fuente
.bashrc
lugar de.bachrc
.No estoy seguro de que funcione así en Linux, suponiendo que no lo haga si nadie lo sugirió. Pero en lugar de usar ././ para volver a los directorios. ¿Puedes usar comillas para darle un camino absoluto? Tal vez no le da acceso a todo el disco para poder incluso hacer eso.
fuente
Si tiene scripts que necesita ejecutar con frecuencia, y dependen de su ubicación para encontrar recursos, puede hacerlo fácilmente combinando comandos en un alias como este.
De esta manera, no tiene que alterar nada más para que funcione.
fuente
No estoy seguro de por qué nadie ha sugerido este, ¡pero es súper fácil! He buscado en Google varias veces y no pude encontrar esta respuesta exacta que estoy dando, así que pensé en compartir. OMI, esta pero la mejor solución, también la más fácil, para mí de todos modos, sin embargo, otros pueden sentir y hacer las cosas de manera diferente.
Primero el comando 'cd' que le dice el directorio de la ubicación de los scripts. Luego '&&' para que pueda vincularlo después de excitar el siguiente comando. ¡Finalmente abra su script tal como lo ejecutaría dentro de la terminal! Guarda tu archivo BASH y tarda 5 segundos en configurarse.
Espero que esto haya ayudado a alguien.
fuente
Antigua pregunta, pero atemporal.
La solución que he visto consistentemente es tener un
$HOME/bin
directorio y ponerlo primero$PATH
(a través de~/.bashrc
si aún no está allí; en algunos sistemas~/bin
está primero en$PATH
forma predeterminada). Colocar scripts allí para su ejecución o enlaces simbólicos a scripts / ejecutables en otra parte es la forma más sencilla de lidiar con problemas de ruta que no deberían afectar al sistema ni a otros usuarios.Si una secuencia de comandos requiere recursos adicionales que se pueden encontrar en relación con su propia ubicación (no es raro),
$BASH_SOURCE
se utiliza el envvar .$BASH_SOURCE
siempre contiene la ruta absoluta al script actualmente en ejecución, independientemente del valor de$PWD
.Considera lo siguiente:
Entonces podemos ver que
$HOME/bin
es el primero en$PATH
entrar, así que todo lo que ponga~/bin
se ejecutará. Tengo un script de demostración llamado~/bin/findme
:Esto se puede usar para obtener la ruta absoluta a la ubicación del script en ejecución.
fuente
bin
directorio privado ? Eso parece engorroso. (3) Además, rompe la independencia de la ubicación. Si/home/desmond/bin/foo
es un enlace a mi script, entoncesBASH_SOURCE
lo será/home/desmond/bin/foo
, y el script no podrá encontrar sus recursos./bin
o en una ubicación conocida/opt
. (3) La independencia de ubicación es exactamente lo que esto conserva al escribir una colección interdependiente de guiones personales.