Как использовать аргументы командной строки, переданные в сценарий оболочки, использующий xargs ?

/ 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 исчезает.

0
24.05.2019, 14:07
3 ответа

Из своего сценария оболочки вы вызываете другую оболочку с -строчным сценарием. Поскольку вы заключаете этот скрипт в одинарные кавычки, $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
1
28.01.2020, 02:30
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 \"{}\";"
1
28.01.2020, 02:30

При использовании 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
0
28.01.2020, 02:30

Теги

Похожие вопросы