Выполнение нескольких команд в одной строке в оболочке

Скажем, у меня есть файл /templates/apple и я хочу

  1. поместите его в два разных места, а затем
  2. удалите оригинал.

Итак, /templates/apple будут скопированы в /templates/used AND /templates/inuse а затем после этого я хочу удалить оригинал.

Является ли cp лучшим способом для этого, а затем rm ? Или есть лучший способ?

Я хочу сделать все это в одной строке, поэтому я думаю, что это будет выглядеть примерно так:

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

Это правильный синтаксис?

Вы используете | (pipe), чтобы направлять вывод команды в другую команду. То, что вы ищете, является оператором && для выполнения следующей команды, только если предыдущий преуспел:

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

Или

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

Суммировать (не исчерпывающе) командные операторы / разделители bash:

  • | трубы (трубопроводы) – стандартный вывод ( stdout ) одной команды в стандартный ввод другого. Обратите внимание, что stderr прежнему входит в свое назначение по умолчанию, каким бы оно ни было.
  • |& выводит как stdout и stderr одной команды в стандартный ввод другого. Очень полезно, доступно в bash версии 4 и выше.
  • && выполняет правую команду && только в том случае, если предыдущий преуспел.
  • || выполняет правую команду || только это предыдущая неудача.
  • ; выполняет правую команду ; всегда независимо от того, была ли предыдущая команда успешной или неудачной. Если ранее не было set -e , которое вызывает ошибку bash при ошибке.

Почему не cp к местоположению 1, затем mv к местоположению 2. Это позаботится об «удалении» оригинала.

И нет, это не правильный синтаксис. | используется для вывода «трубы» из одной программы и превращения ее в ввод для следующей программы. Что вы хотите ; , который разделяет несколько команд.

 cp file1 file2 ; cp file1 file3 ; rm file1 

Если вам требуется, чтобы отдельные команды ДОЛЖНЫ преуспеть до того, как можно будет запустить следующий, то вместо этого вы должны использовать && :

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

Таким образом, если какая-либо из команд cp завершится с ошибкой, rm не будет работать.

Заметим, что cp AB; rm A cp AB; rm A точно mv AB . Это будет быстрее, так как вам не нужно фактически копировать байты (при условии, что пункт назначения находится в одной и той же файловой системе), просто переименуйте файл. Итак, вы хотите cp AB; mv AC cp AB; mv AC

Попробуй это..

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

Другой вариант – набрать Ctrl + V Ctrl + J в конце каждой команды.

Пример (замените # на Ctrl + V Ctrl + J ):

 $ echo 1# echo 2# echo 3 

Вывод:

 1 2 3 

Это приведет к выполнению команд независимо от того, были ли предыдущие неудачны.

То же, что: echo 1; echo 2; echo 3 echo 1; echo 2; echo 3

Если вы хотите остановить выполнение неудачных команд, добавьте && в конце каждой строки, кроме последней.

Пример (замените # на Ctrl + V Ctrl + J ):

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

Вывод:

 1 failed-command: command not found 

В zsh вы также можете использовать Alt + Enter или Esc + Enter вместо Ctrl + V Ctrl + J

Использование труб кажется мне странным. В любом случае вы должны использовать логический and оператор Bash:

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

Если команды cp выходят из строя, rm не будет выполняться.

Или вы можете сделать более сложную командную строку, используя цикл for и cmp .

  • Есть ли способ ввода автоматически при запуске оболочки?
  • Как я могу установить CentOS 6 без gui?
  • Используйте экран GNU в качестве логина "shell"
  • Автоматизировать передачу файла scp с использованием сценария оболочки
  • Как вставить pg_backend_pid из postgresql в сценарий оболочки и передать его другому процессу?
  • Сценарий оболочки для удаления каталогов старше n дней
  • Удаление повторяющихся строк без сортировки
  • Как закрыть компьютер с определенным IP-адресом?
  • Команда оболочки для суммирования целых чисел, по одной в строке?
  • Различия и выполнение `set` &` env`?
  • Требуется сценарий оболочки bash для чтения пар значений имени из файла
  • Давайте будем гением компьютера.