¿Cómo ejecuto un script de shell sin usar los comandos "sh" o "bash"?


261

Tengo un script de shell que quiero ejecutar sin usar los comandos "sh" o "bash". Por ejemplo:

En vez de: sh script.sh

Quiero usar: script.sh

¿Cómo puedo hacer esto?

PD (i) No uso mucho el script de shell e intenté leer sobre alias, pero no entendí cómo usarlos.

(ii) También leí acerca de vincular el script con otro archivo en las variables PATH. Estoy usando el servidor de mi universidad y no tengo permisos para crear un archivo en esas ubicaciones.


1
Las respuestas indican cómo hacer que el script sea ejecutable, pero no parecen cubrir cómo hacerlo accesible. Para eso, cree un directorio bin - $HOME/bin, si aún no tiene uno, agréguelo a su RUTA (cerca del frente). Coloque los scripts (y cualquier otro programa) que desee ejecutar directamente sin especificar el nombre de ruta aquí, o los enlaces simbólicos aquí donde están los programas reales.
Jonathan Leffler

1
Después de seguir la (s) respuesta (s) a continuación, para soltar el ".sh" puede cambiar el nombre del archivo: mv example.sh exampley luego exampledebería funcionar por sí solo.
PJ Brunet

Respuestas:


434

Agregue un "shebang" en la parte superior de su archivo:

#!/bin/bash

Y haga que su archivo sea ejecutable ( chmod +x script.sh).

Finalmente, modifique su ruta para agregar el directorio donde se encuentra su script:

export PATH=$PATH:/appropriate/directory

(normalmente, desea $HOME/binalmacenar sus propios scripts)


Hey, gracias por tu respuesta. Lo intenté Ahora puedo ejecutarlo sin el comando "sh". Pero todavía tengo que prefijar el comando con "./", que no quiero. :)
Rameez Hussain

55
Ver comentarios sobre el camino. Debe colocar su script en un directorio que debe agregar a su RUTA.
fge

2
No funcionó en mi caso. pero source script.shfuncionó bien, o más bien source <filename_without_any_extension_type>
MycrofD

44
source ./my-cool-script(o . ./my-cool-script) contaminará la sesión de shell actual con cualquier variable definida en el script. El aprovisionamiento no debe usarse a menos que desee modificar explícitamente la sesión de shell configurando vars de entorno, cambiando el directorio, etc. De lo contrario, podrían producirse errores realmente terribles, ya que las variables de la ejecución de un script, si se realiza a través del aprovisionamiento, podrían afectar la ejecución de otro script.
Daniel Waltrip

3
Si está seguro de que la carpeta de secuencia de comandos está en RUTA y aún no funciona sin ella ./, es posible que tenga una colisión de nombres. Intenta renombrar.
chorbs

66

Estos son algunos de los requisitos previos para usar directamente el nombre del script:

  1. Añade el she-bang (#!/bin/bash) línea en la parte superior.
  2. Usando chmod u+x scriptnamehacer el script ejecutable. (dóndescriptname está el nombre de tu script)
  3. Coloque el guión debajo /usr/local/bin carpeta.
  4. Ejecute el script usando solo el nombre del script.

Nota: La razón por la que sugerí colocarlo debajo de la /usr/local/bincarpeta es porque lo más probable es que esa ruta ya esté agregada a suPATH variable .

Actualizar:

Si no tiene acceso a la /usr/local/bincarpeta, haga lo siguiente:

  1. Cree una carpeta en su directorio personal y llamémosla myscripts.
  2. Haga ls -larten su directorio de inicio, para identificar la secuencia de comandos de inicio que utiliza su shell. Debería ser .profileo .bashrc.
  3. Una vez que haya identificado el script de inicio, agregue la siguiente línea en su script: export set PATH=$PATH:~/myscript .
  4. Una vez agregado, obtenga el script de inicio o cierre la sesión y vuelva a iniciarla.
  5. Ejecute su script usando scriptname.

Intenté hacer esto pero no tengo los permisos para acceder a la carpeta / usr / local / bin. Estoy usando una computadora de la universidad.
Rameez Hussain

1
¿Podrías decirme a qué te refieres con "busca tu script de inicio"?
Rameez Hussain

1
Obtener el script de inicio significa ejecutarlo de modo que el parámetro recién configurado en la variable PATH sea recogido por el shell. Esto se puede hacer haciendo . .bashrc. Es decir, solo ponga .seguido de spacey luego su nombre de script de inicio.
jaypal singh

No sé cuál es el problema con el sistema. Creé un nuevo script de shell llamado "hola" con solo un "echo" hola "" en él. Cambié sus permisos e intenté ./hello. No funciona. dice-
Rameez Hussain

¿Qué cambios ha realizado en sus scripts de inicio?
jaypal singh

20

Solo asegúrate de que sea ejecutable, usando chmod +x . De manera predeterminada, el directorio actual no está en su RUTA, por lo que deberá ejecutarlo como ./script.sh, o de lo contrario, hacer referencia a él por una ruta calificada. Alternativamente, si realmente necesita solo script.sh, necesitaría agregarlo a su RUTA. (Es posible que no tenga acceso para modificar la ruta del sistema, pero es casi seguro que puede modificar la RUTA de su propio entorno actual). Esto también supone que su secuencia de comandos comienza con algo como#!/bin/sh .

También podría usar un alias, que no está realmente relacionado con el script de shell, sino solo el shell, y es simple como:

alias script.sh='sh script.sh'

Lo que le permitiría usar simplemente script.sh(literalmente, esto no funcionará para ningún otro *.sharchivo) en lugar de sh script.sh.


¡Oye! Gracias por su respuesta. Intenté usar alias anteriormente. Pero nada pasó. Lo coloqué inmediatamente después de la línea "#! / Usr / local / bin / bash". ¿Qué crees que está mal?
Rameez Hussain

1
No se puede definir un alias dentro de su script; debe declararse como parte de su entorno actual. Así que simplemente ejecute el aliascomando en el indicador de comandos de la shell y luego el alias estará disponible para ejecutar el comando.
ziesemer

17

En este ejemplo, el archivo se llamará myShell

En primer lugar, tendremos que crear este archivo, podemos comenzar escribiendo lo siguiente:

sudo nano myShell

¿Notaron que no pusimos la .shextensión? ¡Eso es porque cuando lo ejecutamos desde la terminal solo necesitaremos escribir myShellpara ejecutar nuestro comando!

Ahora, en nano la línea superior DEBE ser #!/bin/bashentonces puede dejar una nueva línea antes de continuar.

Para la demostración agregaré una Hello World!respuesta básica

Entonces, escribo lo siguiente:

echo Hello World!

Después de eso, mi ejemplo debería verse así:

#!/bin/bash
echo Hello World!

Ahora guarde el archivo y luego ejecute este comando:

sudo chmod +x myShell

Ahora que hemos ejecutado el archivo, podemos moverlo /usr/bin/usando el siguiente comando:

sudo cp myShell /usr/bin/

Solo para asegurarnos de que la máquina pueda ejecutarlo correctamente, necesitaremos reiniciar la máquina

solía sudo shutdown -r now

Felicidades! ¡Nuestro comando ya está hecho! En la terminal podemos escribir myShelly debería decirHello World!


1
No debe colocar sus propios archivos /usr/bin: muchos sistemas funcionan /usr/local/binpara este propósito y se reservan /usr/binestrictamente para el sistema operativo.
tripleee

No hay necesidad de sudo chmodsu propio archivo.
tripleee

No es necesario reiniciar la máquina. A lo sumo deberías
buscar de

14

Debe habilitar el bit ejecutable para el programa.

chmod +x script.sh

Entonces puedes usar ./script.sh

Puede agregar la carpeta a la RUTA en su .bashrcarchivo (ubicado en su directorio de inicio). Agregue esta línea al final del archivo:

export PATH=$PATH:/your/folder/here

Olvidé mencionar que ya he establecido los permisos correctos. Usé el comando "chmod 755 script.sh"
Rameez Hussain el

6

Puede escribir sudo install (nombre del script) / usr / local / bin / (lo que desea escribir para ejecutar dicho script)

Ej: sudo install quickcommit.sh /usr/local/bin/quickcommit ingrese la contraseña

ahora puede ejecutarse sin .sh y en cualquier directorio


3

Añadir (directorio actual) a su variable PATH.
Puede hacer esto editando su archivo .profile.
ponga la siguiente línea en su archivo .profile
PATH=$PATH:.

Solo asegúrese de agregar la línea Shebang ( #!/bin/bash) al comienzo de su script y hacer que el script sea ejecutable (usando chmod +x <File Name>).


0

Aquí está mi script de respaldo que le dará la idea y la automatización:

Servidor: Ubuntu 16.04 PHP: 7.0 Apache2, Mysql, etc.

# Make Shell Backup Script - Bash Backup Script
    nano /home/user/bash/backupscript.sh
        #!/bin/bash
        # Backup All Start
        mkdir /home/user/backup/$(date +"%Y-%m-%d")
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_rest.zip /etc -x "*apache2*" -x "*php*" -x "*mysql*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_apache2.zip /etc/apache2
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_php.zip /etc/php
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_mysql.zip /etc/mysql
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_rest.zip /var/www -x "*html*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_html.zip /var/www/html
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/home_user.zip /home/user -x "*backup*"
        # Backup All End
        echo "Backup Completed Successfully!"
        echo "Location: /home/user/backup/$(date +"%Y-%m-%d")"

    chmod +x /home/user/bash/backupscript.sh
    sudo ln -s /home/user/bash/backupscript.sh /usr/bin/backupscript

cambie / home / user a su directorio de usuario y escriba: backupscript en cualquier lugar del terminal para ejecutar el script. (suponiendo que / usr / bin está en su camino)


0

Ingrese "#!/bin/sh"antes del script. Luego guárdelo como, script.shpor ejemplo. copiarlo $HOME/bin o $HOME/usr/bin
El directorio puede ser diferente en diferentes distribuciones de Linux pero terminan con 'bin' y están en el directorio principal cd $HOME/bin o $HOME/usr/bin
Tipo chmod 700 script.sh
Y se puede ejecutar con tan sólo escribir run.sh en el terminal. Si no funciona, intente en chmod +x run.sh lugar de chmod 700 run.sh


Las partes de esta respuesta que no repiten la información de las respuestas existentes muy antiguas son confusas.
tripleee

0

Hacer cualquier archivo como ejecutable


Supongamos que tiene un archivo ejecutable llamado migrate_linux_amd64 y desea ejecutar este archivo como un comando como "migrate"

  1. Primero pruebe el archivo ejecutable desde la ubicación del archivo:
[oracle@localhost]$ ./migrate.linux-amd64 
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version
  1. Asegúrese de tener privilegios de ejecución en el archivo,
    -rwxr-xr-x 1 oracle oinstall 7473971 May 18 2017 migrate.linux-amd64
    si no, ejecutechmod +x migrate.linux-amd64

  2. Luego copie su archivo a /usr/local/bin. Este directorio es propiedad de root, usa sudo o cambia a root y realiza la siguiente operación

sudo cp migrate.linux-amd64 /usr/local/bin
sudo chown oracle:oracle /user/local/bin/migrate.linux.amd64
  1. Luego crea un enlace simbólico como el siguiente
sudo ln /usr/local/bin/migrate.linux.amd64 /usr/local/bin/migrate
sudo chown oracle:oracle /usr/local/bin/migrate
  1. Finalmente agregue / usr / local / bin a su ruta o perfil de usuario
export PATH = $PATH:/usr/local/bin
  1. Luego ejecute el comando como "migrar"
[oracle@localhost]$ migrate
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version

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.