Ejecutar varios comandos en una línea en el shell


Digamos que tengo un archivo /templates/apple y quiero

  1. ponlo en dos lugares diferentes y luego
  2. retire el original.

Entonces, /templates/apple se copiará a /templates/used Y /templates/inuse y después de eso me gustaría quitar el original.

Es cp la mejor manera de hacer esto, seguido de rm? O hay una mejor manera?

Quiero hacerlo todo en una línea, así que estoy pensando que se vería algo como:

cp /templates/apple /templates/used | cp /templates/apple /templates/inuse | rm /templates/apple

Es esta la sintaxis correcta?

 268
Author: codeforester, 2011-02-27

6 answers

Está utilizando | (pipe) para dirigir la salida de un comando a otro comando. Lo que está buscando es el operador && para ejecutar el siguiente comando solo si el anterior tuvo éxito:

cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple

O

cp /templates/apple /templates/used && mv /templates/apple /templates/inuse

Para resumir (no exhaustivamente) los operadores/separadores de comando de bash:

  • | tuberías (oleoductos) la salida estándar (stdout) de un comando a la entrada estándar de otro. Tenga en cuenta que stderr todavía entra en su valor predeterminado destino, sea lo que sea.
  • |&tuberías tanto stdout y stderr de un comando a la entrada estándar de otro. Muy útil, disponible en bash versión 4 y superior.
  • && ejecuta el comando de la derecha de && solo si el anterior tuvo éxito.
  • || ejecuta el comando de la derecha de || solo que el anterior falló.
  • ; ejecuta el comando de la derecha de ; siempre independientemente de si el comando anterior tuvo éxito o falló. Unless set -e was previously invoked, which causes bash to fail on an error.
 547
Author: Maxim Egorushkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-26 01:06:39

Por qué no cp a la ubicación 1, luego mv a la ubicación 2. Esto se encarga de" quitar " el original.

Y no, no es la sintaxis correcta. | se usa para "canalizar" la salida de un programa y convertirla en entrada para el siguiente programa. Lo que quieres es ;, que separa varios comandos.

cp file1 file2 ; cp file1 file3 ; rm file1

Si requiere que los comandos individuales TENGAN éxito antes de que se pueda iniciar el siguiente, entonces usaría && en su lugar:

cp file1 file2 && cp file1 file3 && rm file1

De esa manera, si cualquiera de los cp los comandos fallan, el rm no se ejecutará.

 60
Author: Marc B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-13 11:23:47

Tenga en cuenta que cp A B; rm A es exactamente mv A B. También será más rápido, ya que no tiene que copiar los bytes (suponiendo que el destino esté en el mismo sistema de archivos), simplemente cambie el nombre del archivo. Así que quieres cp A B; mv A C

 7
Author: glenn jackman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-27 13:00:17

Prueba esto..

cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple

 2
Author: Peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-27 01:44:05

Otra opción es escribir Ctrl+V Ctrl+J al final de cada comando.

Ejemplo (reemplazar # con Ctrl+V Ctrl+J):

$ echo 1#
echo 2#
echo 3

Salida:

1
2
3

Esto ejecutará los comandos independientemente de si los anteriores fallaron.

Igual que: echo 1; echo 2; echo 3

Si desea detener la ejecución de comandos fallidos, agrega && al final de cada línea, excepto la última.

Ejemplo (reemplazar # con Ctrl + V Ctrl + J):

$ echo 1 &&#
failed-command &&#
echo 2

Salida:

1
failed-command: command not found

{[9] {} En[8]} también se puede utilizar Alt+Enter o Esc+Enter en lugar de Ctrl+V Ctrl+J
 2
Author: Eyal Levin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-02 06:08:34

Usar tuberías me parece raro. De todos modos, debe usar el operador Bash lógico and:

$ cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apples

Si los comandos cp fallan, el rm no se ejecutará.

O bien, puede hacer una línea de comandos más elaborada usando un bucle for y cmp.

 1
Author: Renaud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-02 17:38:30