¿Qué significa ampersand al final de una línea de script de shell?

118
sh sys-snap.sh &

¿Qué es sh? ¿Qué es sys-snap.sh? ¿Por qué debería poner &al final de la línea? ¿Alguien puede explicar la sintaxis?

Sin el &script, no volveré al indicador hasta que presione Ctrl+ C. Con &puedo presionar enter y funciona.

user4951
fuente
2
¿Es el doble ampersand &&diferente de un solo ampersand &?
Charlie Parker
1
@CharlieParker ¿Alguna vez has encontrado una respuesta a eso? Estoy tratando de descubrir la diferencia yo mismo. (Editar: Nevermind, lo encontré más abajo)
Drazen Bjelovuk

Respuestas:

94

shes el shell predeterminado compatible con Bourne (generalmente bash o dash)

sys-snap.shes un script de shell, que contiene comandos que se shejecutan. Como no publicas su contenido, solo puedo adivinar por su nombre lo que hace. Puedo encontrar un script relacionado con CPanel con el mismo nombre de archivo, que crea un archivo de registro con todos los procesos actuales, uso de memoria actual, estado de la base de datos, etc. Si el script comienza con una línea shebang ( #!/bin/sho similar), puede hacerlo ejecutable con chmod +x sys-snap.she iniciarlo directamente usando ./sys-snap.shsi está en el directorio actual.

Con &el proceso comienza en segundo plano, para que pueda continuar utilizando el shell y no tenga que esperar hasta que finalice el script. Si lo olvida, puede detener el proceso de ejecución actual con Ctrl-Zy continuar en segundo plano con bg(o en primer plano con fg). Para más información, ver control de trabajos

jofel
fuente
44
shen usualmente solo basho dashen sistemas basados ​​en Linux (o OS / X reciente). En los BSD, generalmente es otra variante de Ash (el guión se basa en NetBSD sh, en sí mismo basado en Almquist Shell) o un derivado de pdksh. En unidades comerciales, generalmente es ksh88.
Stéphane Chazelas
1
@jofel: ¿Qué sucede si se ejecuta el siguiente script y, por error, ejecuté Ctrl-C? ¿Se ejecutará mi script o se terminará? Ej: sh sys-snap.sh &
Hussain7
2
@ Hussain7 Ctrl-C se envía siempre al proceso actual en primer plano. Si se inicia el script de shell &y, por lo tanto, en segundo plano, solo se obtiene un nuevo indicador de shell.
jofel
2
¿Es el doble ampersand &&diferente de un solo ampersand &?
Charlie Parker
77
@CharlieParker Sí, "&&" es la función "y". El comando después de && se llama solo cuando el comando anterior tiene éxito. El ejemplo "verdadero && echo funciona" salida "funciona, pero" false && echo no output "no llama a la función echo.
jofel
87

Esto se conoce como job controlbajo unix. El &informa al shell para poner el comando en segundo plano. Esto significa que continúa ejecutando el sys-snap.shcomando pero lo regresa a su shell para permitirle continuar haciendo comandos paralelos.

Puede ver la lista de trabajos que se ejecutan actualmente con el jobscomando. Puede volver al comando (poner en primer plano) con el uso del fgcomando. Lo que devuelve el comando al estado en el que no ve ningún mensaje y tiene que emitir Ctrl, Cpara matar el proceso. Sin embargo, puede suspender (pausar) ese proceso, emitiendo Ctrl- Z. Esto hará una pausa sys-snap.shy te devolverá a tu mensaje. Puede entonces fondo que (como si la hubiera emitido con la &) con el bgcomando, y se reanuda la ejecución de esta en pausa el estado Ctrl- Zlo había puesto en.

Tenga en cuenta que puede tener más de un trabajo a la vez (como se muestra en jobs):

[1]-  Running          sys-snap.sh &
[2]+  Running          another-script.sh &

Puede ponerlos en segundo plano y en primer plano utilizando su número de trabajo, %1será sys-snap.shy %2será another-script.sh. Si usa fgo bgsin argumentos, ejecutará el comando en el trabajo marcado +en el jobsresultado anterior.

fg %1

volverá a poner sys-snap.shen primer plano, dejando another-script.shen segundo plano.

Puede emitir la secuencia Ctrl- Cpara ejecutar trabajos sin tener que ponerlos en primer plano con el killcomando, kill %1enviará el equivalente de Ctrl- Ca sys-snap.sh.

Si está utilizando bash shell, el man bashcomando tiene una sección detallada debajo de la sección titulada 'CONTROL DE TRABAJO' que entra en más detalles.

En cuanto al nombre de sys-snap.sh, bajo los nombres de archivo Unix son arbitrarios (con un par de excepciones, como los archivos de carga dinámica). No es necesario que tengan extensiones de archivo específicas para que se ejecuten como un script de shell, invoquen otros comandos como perlo phpetc. Se suele usar para proporcionar claridad, que en este caso, es .shun Script de Shell que utiliza Bourne Shell /bin/sh.

La parte funcional de sys-snap.sh(cuando miras su contenido con algo como el lesscomando) es el Shebang . En la primera línea probablemente encontrarás uno de:

#! /bin/sh
#! /bin/bash
#! /usr/local/bin/bash

o similar. En términos básicos, se ejecuta un comando después de #!(como /bin/sh) y el contenido del resto del archivo de script se alimenta de una línea a la vez. Tenga en cuenta que el archivo también debe configurarse como ejecutable chmodpara que pueda ejecutarlo como un comando. Si no se establecieron los permisos, entonces shebangno tiene ningún efecto, ya que obtendría el error:

bash: sys-snap.sh: command not found

o si lo ejecutó por ruta explícita ./sys-snap.sh(es .decir, el directorio de trabajo actual) obtendría:

bash: ./sys-snap.sh: Permission denied

La otra alternativa es dejarlo sin permisos de ejecución y pedirle explícitamente a / bin / sh que lo ejecute:

/bin/sh sys-snap.sh &
Drav Sloan
fuente
3
Esta es una respuesta genial. Una posible sugerencia es agregar también lo que nohuphace, ya que a menudo se usa junto con &para iniciar un proceso y poder matar el shell que lo lanzó sin matar el proceso.
Tommy
@Drav, ¿es cierto que jobssiempre volverá vacío si es el primer comando?
Pacerier
Tenga en cuenta que el uso &al final de un comando solo se separa stdin(pero no stdouto stderr), lo que implica que si su comando / script se ejecuta en segundo plano pero al escribir stdout, puede encontrarse con una situación en la Ctrl + cque no se detendrá la salida, pero podría para escribir comandos. Esto se debe a que el proceso en segundo plano está escribiendo stdoutpero no puede detenerlo porque no se está ejecutando en primer plano. Más información aquí .
vadasambar
4

shEs una concha. Qué shell depende exactamente del sistema. Ejemplo para un sistema que utiliza bashcomo su shell estándar:

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 13 16:12 /bin/sh -> bash

$ sh --version
GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu)

sys-snap.shserá un script de shell de algún tipo, por sh sys-snap.shlo que ejecutará el script de shell.

&hará que el proceso de shell se ejecute en segundo plano. Sin &ella permanecerá en primer plano hasta que finalice el guión. El script funcionará de cualquier manera, es solo una cuestión de esperar a que el script finalice o no antes de ejecutar más comandos.

Frostschutz
fuente
1

¿Está su servidor en hostgator?

El script sys-snap.shes un script especial escrito por el equipo hostgator para recopilar todos los archivos de registro y datos para el sistema, por lo que utilizan su salida para monitorear y recopilar la información del sistema.

tareq.t
fuente
No, no estoy usando hostgator.
user4951
1
@ J.Chang El script es parte de cPanel que Hostgator y cientos de otros hosts usan.
472084
@ 472084, ¿Qué versión de cpanel?
Pacerier