Как определить, что я нахожусь в подоболочке?

POSIBLEMENTE:

find. ! \( -name '*.tr0' -o -name '*.scs' \) -type f -exec echo rm -f {} +

(Elimina echocuando quieras ejecutar el comando)

Si su findapoyo-delete:

find. ! \( -name '*.tr0' -o -name '*.scs' \) -type f -delete

El comando anterior funcionará recursivamente. Si desea solo en el directorio actual:

find. ! -name. -prune ! \( -name '*.tr0' -o -name '*.scs' \) -type f
26
16.06.2019, 13:15
3 ответа

[это должен был быть комментарий, но мои комментарии, как правило, удаляются модераторами, так что это останется как ответ, который я мог бы использовать в качестве ссылки, даже если он будет удален]

Использование BASH_SUBSHELLсовершенно ненадежно, так как оно установлено в 1 только в некоторых подоболочках, а не во всех подоболочках.

$ (echo $BASH_SUBSHELL)
1
$ echo $BASH_SUBSHELL | cat
0

Прежде чем утверждать, что подпроцесс, в котором выполняется конвейерная команда, не является действительно настоящей подоболочкой, рассмотрим этот man bashфрагмент:

Each command in a pipeline is executed as a separate process (i.e., in a subshell).

и практические последствия --важно, выполняется ли фрагмент скрипта как подпроцесс или нет, а не какая-то терминологическая придирка.

Единственное решение, как уже объяснялось в ответах на этот вопрос , состоит в том, чтобы проверить, равно ли $BASHPID$$или, переносимо, но гораздо менее эффективно:

if [ "$(exec sh -c 'echo "$PPID"')" != "$$" ]; then
    echo you\'re in a subshell
fi
20
27.01.2020, 19:39

Как насчет BASH_SUBSHELL?

BASH_SUBSHELL
      Incremented by one within each subshell or subshell environment when the shell
      begins executing in that environment. The initial value is 0.

$ echo $BASH_SUBSHELL
0
$ (echo $BASH_SUBSHELL)
1
43
27.01.2020, 19:39

В bash вы можете сравнить $BASHPIDс$$

$ ( if [ "$$" -eq "$BASHPID" ]; then echo not subshell; else echo subshell; fi )
subshell
$   if [ "$$" -eq "$BASHPID" ]; then echo not subshell; else echo subshell; fi
not subshell

Если вы не используете bash, $$должен оставаться тем же самым в подоболочке, поэтому вам понадобится какой-то другой способ получить фактический идентификатор процесса.

Один из способов получить фактический pid — sh -c 'echo $PPID'. Если вы просто поместите это в обычный ( … ), может показаться, что он не работает, так как ваша оболочка оптимизировала вилку. Попробуйте дополнительные команды no -op ( : ; sh -c 'echo $PPID'; : ), чтобы он думал, что подоболочка слишком сложна для оптимизации. Кредит принадлежит John1024 на Stack Overflow за этот подход.

45
27.01.2020, 19:39

Теги

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