Ejecutar varios comandos en una línea en el shell
Digamos que tengo un archivo /templates/apple
y quiero
- ponlo en dos lugares diferentes y luego
- 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?
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 questderr
todavía entra en su valor predeterminado destino, sea lo que sea. -
|&
tuberías tantostdout
ystderr
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ó. Unlessset -e
was previously invoked, which causesbash
to fail on an error.
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á.
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
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
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
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
.
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