/ proc / [pid]
исчезает при выходе из программы. См. Это: https://superuser.com/questions/365576/lifetime-of-the-symlinks-from-the-file-descriptors-in-proc-pid-fd
редактировать:
На странице руководства wait говорится:
Функция wait () должна приостанавливать выполнение вызывающего потока до тех пор, пока не станет доступна информация о состоянии для одного из завершенных дочерних процессов вызывающего процесса или пока не будет доставлен сигнал, действие которого заключается либо в выполнении функции перехвата сигнала, либо в завершении процесса.
Таким образом, возможно, что будет доставлен сигнал о завершении дочернего процесса. Затем wait
вернулся, но дочерний процесс еще не завершился. Так что вы все еще можете читать / proc / pid / stat
. Когда дочерний процесс завершается, / proc / pid / stat
исчезает.
Из своего сценария оболочки вы вызываете другую оболочку с -строчным сценарием. Поскольку вы заключаете этот скрипт в одинарные кавычки, $1
передается как есть. Новая оболочка, которую вы только что запустили, имеет собственный набор параметров, которые оказались пустыми. Так что при синтаксическом анализе $1
он ничем не расширяется.
В вашем рабочем примере вы присваиваете значение новой переменной, которая видна в новой оболочке.
Если вы просто пытаетесь найти все репозитории git, вы также можете скопировать мой скрипт all-git
ниже. Использование простое :all-git <git command>
, например.all-git status -bs
#!/bin/bash
for repo in `find $PWD -type d -name.git`
do
repo=${repo%.git}
(
cd $repo
echo "${repo%/}: " | sed -e "s#$HOME#~#"
git "$@"
)
done
find. -type d -exec test -e '{}/.git' ';' -print -prune | \
xargs -P $(nproc) -I {} sh -c "cd \"{}\"; echo \"\$(pwd) $1\"; echo "
Должно работать, но также обратите внимание, что вы можете вызвать экспортированную функцию.
OPT="$1"
function doGitWork {
DIR="$1"
cd "$DIR"
echo "$(pwd) $OPT"
}
export -f doGitWork
find. -type d -exec test -e '{}/.git' ';' -print -prune | \
xargs -P $(nproc) -I {} sh -c "doGitWork \"{}\";"
При использовании GNU Parallel это выглядит так:
find. -type d -exec test -e '{}/.git' ';' -print -prune |
parallel 'cd {}; echo $(pwd) {}; echo'
Если вы хотите выполнить git pull
во всех каталогах, в которых есть каталог .git
:
allgit() {
find. -type d -name.git |
parallel --tagstring {//} "cd {//}; git $@"
}
allgit pull