¿Cómo hacer que un script de shell sea global?


82

Estoy en el sistema operativo 10.6 de Mac y estoy tratando de aprender un par de cosas sobre las secuencias de comandos de shell. Entiendo cómo guardar un script de shell y convertirlo en ejecutable, pero me pregunto qué puedo hacer o dónde puedo guardar el archivo para hacerlo global (es decir, accesible sin importar en qué carpeta esté).

Por ejemplo, si guardo un archivo .sh en el directorio / Users / username / y lo hago ejecutable, solo puedo ejecutar ese script en ese directorio específico. Si navego a / Users / username / Downloads, por ejemplo, no puedo ejecutar el script.

Además, sería útil cualquier sugerencia de recursos para aprender más sobre secuencias de comandos de shell. Gracias


1
PATHPrimero lea sobre la variable de entorno y luego actualice la pregunta.
S.Lott

Respuestas:


135

/usr/local/binsería la ubicación más apropiada. Mac OS X lo tiene PATHpor defecto


¡Bingo! Gracias :)
Patrick Lynch

44

Tradicionalmente, tales scripts entran ~/bin(es decir, el directorio bin en su directorio de inicio) o. /usr/local/bin/El primero significa que el script solo funcionará para usted, el segundo es para los scripts que desea que cualquier persona del sistema pueda ejecutar.

Si lo coloca ~/bin, es posible que deba agregarlo a su variable de entorno PATH. /usr/local/binya debería estar en el camino.


30

Hay dos maneras de hacerlo -

  1. Coloque su script en usr / local / bin y asegúrese de que sea ejecutable (chmod + x my_script) (Esto ya está configurado en la ruta, puede verificarlo haciendo un echo $ PATH)
  2. Cree una carpeta en su directorio personal llamada bin. (Para sus guiones personales)
    • cd ~ (lo lleva a su directorio de inicio)
    • mkdir bin (crea una carpeta bin)
    • vim .bash_profile (para establecer la variable de entorno de ruta)
    • export PATH = ~ / bin: $ PATH (Presione i luego agregue esta línea y luego haga esc y escriba: wq)
    • Ahora puede simplemente escribir el nombre de su script y ejecutarlo desde cualquier lugar que desee.

** NOTA : Si desea ejecutar el script con un comando abreviado en lugar de escribir el nombre de archivo completo, agregue lo siguiente a su .bash_profile:
alias myscript='my_script.sh'
Luego, puede ejecutar el script simplemente escribiendo myscript. (puedes sub en el alias que quieras)


4

En el sistema operativo mac

  • Abra el archivo bash ~ / .bashrc.
  • agregue la ruta de su script en su archivo bashrc, usando export PATH = "$ PATH: /Users/sher.mohammad/Office/practice/practiceShell"
  • Abra su archivo ~. / Bash_profile y agregue [[-s ~ / .bashrc]] && source ~ / .bashrc
  • abre una nueva ventana de terminal Ahora, cada vez que abras tu terminal, se cargará tu script

¿Por qué no ponerlo directamente .bash_profile? Es mucho más simple (y esa cosa de fuente .bashrc nunca funcionó para mí).
szeitlin

Investigué y encontré que bash_profile se ejecuta cuando inicias sesión, bashrc se usa para shells que no son de inicio de sesión, OS X por defecto como shell de inicio de sesión y cargar bash_profile, por lo que agregar bash_profile funcionará bien, y si escribes en bashrc tienes que agregar [[- s ~ / .bashrc]] && source ~ / .bashrc en bash_profile, para cargar bashrc cuando bash_profile se ejecuta en el momento del inicio de sesión
Sher Mohammad

4

¡Este es muy fácil si está familiarizado con su archivo bashrc! Esto utilizará completamente solo su archivo .bashrc y tardará 2 segundos en realizarse.

(Yo uso Arch Linux Manjaro, así que uso .bashrc ubicado en mi directorio de inicio)

El código que se colocará en su archivo .bashrc:

# Simple bashrc method to launch anything in terminal from any directory

YOURCOMMAND () {
  cd /path/to/directory/containing/your/script/ && ./YOURSCRIPT
}

Como puede ver, primero usa el comando 'cd' simple y le da el directorio de la ubicación de los scripts, luego use '&&' para que pueda ejecutar el siguiente comando inmediatamente después, y finalmente abra su script tal como lo haría ¡normalmente! ¡Súper fácil y guardado directamente en su archivo .bash! :)

¡Espero haber ayudado a alguien!

Sinceramente,

AnónimoX


esto es genial ... ¡y permite que mi zsh se autocomplete!
Milán

2

Al usar bash shell, escriba ese script como función y luego colóquelo en .bashrc o obtenga el archivo que contiene esa función por "source file_name"

Ahora ejecute el script mediante una llamada a la función en el shell.


1

O guardarlo en /usr/bin(o en cualquier otro directorio presente PATH) o editarlo PATHpara incluir el directorio en el que lo guardó básicamente hará que se ejecute en cualquier directorio.


7
/usr/binse puede vaciar y reemplazar completamente durante una actualización del sistema operativo, haciendo que su script desaparezca misteriosamente. /usr/local/bines para este propósito, como lo menciona Bryan Oakley. Consulte también el Estándar de jerarquía
Stephen P

0

desde el directorio de trabajo de 'script.sh' "mv [script.sh] / usr / local / bin" (no probado pero parece ser la forma menos compleja en mi opinión).


1
Probablemente lo necesite sudo mv script.sh /usr/local/bin, ya que ese directorio no se puede escribir sin aumentar los privilegios.
Perette

-2

Debería ponerlo en el directorio ejecutable global de su máquina. Creo que normalmente sería /usr/binen sistemas operativos basados ​​en Unix (sin embargo, esto a menudo requeriría privilegios de superusuario en esa máquina).

También podría ponerlo en cualquier otro directorio que esté en la $PATHvariable de entorno, aunque solo funcionaría para aquellos usuarios que tengan ese directorio en esa variable.

Puede encontrar el valor de $PATHescribiendo echo $PATHen un shell. Los directorios están separados por : .


9
Voy a votar en contra porque / usr / bin es la respuesta incorrecta. / usr / local / bin está diseñado específicamente para scripts "locales" (es decir, los que usted crea en lugar de los que vienen con el sistema).
Bryan Oakley
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.