Группы команд в оболочке Linux - PullRequest
2 голосов
/ 08 августа 2011

Предположим, у меня есть этот скрипт сценария вызова cpdir:

(cd $1 ; tar -cf - . ) | (cd $2 ; tar -xvf - )

Когда я запустил его, основная оболочка должна создать два процесса (подоболочки) для одновременного выполнения обеих групп команд. Однако как оболочка может убедиться, что оба процесса перейдут в соответствующие каталоги, затем сначала процесс упакует содержимое каталога и отправит второму процессу для распаковки?

Почему нет расы? Является ли правилом, что каждая команда каждого процесса будет выполняться по порядку, хотя процессы могут быть параллельными?

т.е. первый процесс будет запускать «cd $ 1», а затем второй процесс будет запускать «cd $ 2» (или он должен быть выполнен в то же время, что и первый процесс? Не уверен), затем первый процесс все упакует и, наконец, отправит во второй процесс.

Хотя, одна маленькая вещь, которую я не знаю о смоле:

tar -cf - .

Я знаю, что точка (.) - это содержимое текущего каталога. Однако что означает «-» в команде?

Ответы [ 3 ]

4 голосов
/ 08 августа 2011

Вам не нужно использовать cd, потому что у tar есть опция -C, которая указывает ей перейти в каталог.Таким образом, вы можете просто использовать команду, такую ​​как:

tar -C $1 -cvf - . | tar -C $2 -xvf -

- означает stdin / stdout.Первый дефис говорит tar написать на стандартный вывод.Второй говорит tar читать со стандартного ввода.

Так как - является значением по умолчанию, вам даже не нужно его указывать.Вы можете сократить свою команду до:

tar -C $1 -c . | tar -C $2 -x
1 голос
/ 08 августа 2011

Поскольку эти группы выполняются в независимых процессах, не имеет значения, какая команда cd запускается первой: у каждого процесса есть свой рабочий каталог.

Таким образом, изменение рабочего каталога не влияет соответственно на другой процесс.

0 голосов
/ 08 августа 2011

Вы передаете команды в вашем случае. Результат, который вы ожидаете, мне не очень понятен. Кстати, мой GNU tar не имеет значения "-" для этой опции "-f". Таким образом, ваши команды могут быть не переносимыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...