AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 541878
Accepted
Porcupine
Porcupine
Asked: 2019-09-16 09:34:00 +0800 CST2019-09-16 09:34:00 +0800 CST 2019-09-16 09:34:00 +0800 CST

Impedir que o argumento bashscript seja transferido para um script de origem filho

  • 772

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
bash
  • 2 2 respostas
  • 372 Views

2 respostas

  • Voted
  1. Freddy
    2019-09-16T10:07:08+08:002019-09-16T10:07:08+08:00

    Você pode mudar os parâmetros posicionais POSIXly com o shift [n]comando (obrigado @ilkkachu) onde né 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 com

    shift $#
    

    antes de fornecer seu script.

    A maneira POSIXly de alterar (definir ou desarmar) os parâmetros posicionais é usar o setcomando. Para desarmar todos os parâmetros posicionais, você pode usar

    set --
    

    antes de fornecer o script.

    • 3
  2. Best Answer
    ilkkachu
    2019-09-16T11:22:54+08:002019-09-16T11:22:54+08:00

    A descrição POSIX do ."utilitário" (Bash sourceé um sinônimo) é:

    NOME: ponto - executa comandos no ambiente atual
    SINOPSE: . file
    DESCRIÇÃO: O shell deve executar comandos do arquivo no ambiente atual.

    E o ambiente de execução é definido para incluir:

    Parâmetros do shell que são definidos por atribuição de variável (consulte o conjunto especial embutido) ou do [ambiente]

    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 setparece 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 ./ sourceem uma função, pois as funções têm seu próprio conjunto de argumentos. Algo como source() { . "$1"; }e então source script.sh, embora isso tornaria o nome do arquivo de origem visível em $1. Embora isso possa ser contornado, no Bash você pode usar source() { 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 fooque o script de origem só veria fooem $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.

    • 2

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve