Eu recebo um bashscript (Child) dentro de outro bashscript (Parent), em algum lugar no meio de Parent. O argumento passado para o Pai ao executá-lo é passado para o Filho. Como posso evitar esse comportamento? Não quero que os argumentos do pai sejam transferidos para o filho também.
NOTA : A analogia Pai Filho não é sobre o processo Pai Filho, mas sobre algo que vem antes do outro.
Além disso, eu queria ter o ambiente do Script pai (exceto os argumentos que são passados para ele) para o script de origem. Isso ocorre porque os valores padrão de argumento para os scripts são diferentes. Veja Exemplo Abaixo. O script pai usa algumas das funções definidas no script de origem e também o script de origem cria matrizes que estão sendo usadas pelo script pai. Além disso, preciso dos parâmetros posicionais do script pai, após a origem do script filho.
#!/usr/bin/env bash
# - goal: "Parent"
main() {
# # Path
#dScriptP="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
# # Argument
ParentArgument=${1:-40}
echo "ParentArgument=${ParentArgument}"
. Child.sh
}
main "$@"
#!/bin/false
# shellcheck shell=bash
# - goal: "Child"
main() {
# # Path
#dScriptP="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
# # Argument
ChildArgument=${1:-30}
echo "ChildArgument=${ChildArgument}"
}
main "$@"
$ ./Parent.sh 50
ParentArgument=50
ChildArgument=50
Saída Desejada
$ ./Parent.sh 50
ParentArgument=50
ChildArgument=30
Você pode mudar os parâmetros posicionais POSIXly com o
shift [n]
comando (obrigado @ilkkachu) onden
é o número de parâmetros para mudar (o padrão é 1). Para desarmar todos os parâmetros, você pode deslocar todos os parâmetros comantes de fornecer seu script.
A maneira POSIXly de alterar (definir ou desarmar) os parâmetros posicionais é usar o
set
comando. Para desarmar todos os parâmetros posicionais, você pode usarantes de fornecer o script.
A descrição POSIX do
.
"utilitário" (Bashsource
é um sinônimo) é:E o ambiente de execução é definido para incluir:
Esse "definido por atribuição de variável" não parece realmente corresponder a como os parâmetros posicionais (argumentos) são atribuídos inicialmente na inicialização do shell, mas a referência a
set
parece implicar que eles devem ser incluídos. E, de qualquer forma, todas as conchas que pude encontrar as incluíam.Portanto, alterar os shells provavelmente não funcionará, mas você tem algumas opções:
Apenas desative os argumentos, com
set --
. Mas eles também não estariam disponíveis no shell principal depois disso. Em Bash/ksh/zsh, você pode salvá-los em um array primeiro,args=("$@")
, mas é claro que esse array seria visível para o script de origem.Execute o
.
/source
em uma função, pois as funções têm seu próprio conjunto de argumentos. Algo comosource() { . "$1"; }
e entãosource script.sh
, embora isso tornaria o nome do arquivo de origem visível em$1
. Embora isso possa ser contornado, no Bash você pode usarsource() { local f=$1; shift; . "$f"; };
.Em Bash/ksh/zsh, você pode adicionar seus próprios argumentos a
.
/source
, caso em que apenas eles estariam disponíveis para o script de origem. Depois. script.sh foo
que o script de origem só veriafoo
em$1
. Mas você não pode passar uma lista vazia de argumentos dessa maneira.Então, novamente, se você não quiser que o outro script veja o ambiente do script principal, não o origine, mas execute-o como um comando, passando todos os dados necessários explicitamente pelos argumentos de scripts, stdin e stdout.