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 / 440088
Accepted
user9303970
user9303970
Asked: 2018-04-26 15:44:53 +0800 CST2018-04-26 15:44:53 +0800 CST 2018-04-26 15:44:53 +0800 CST

O que é substituição de comando em um shell? [duplicado]

  • 772
Esta pergunta já tem respostas aqui :
O que ` (backquote/backtick) significa em comandos? (6 respostas)
Fechado há 4 anos .

Estou usando o Ubuntu 16.04 com Bash e tentei ler na Wikipedia , aqui e aqui , mas não consegui entender o significado de "substituição de comando" em scripts de shell em geral e em Bash em particular, como em:

$(command)

ou

`command`

Qual é o significado deste termo?

Editar: Quando publiquei esta pergunta pela primeira vez, já conhecia o conceito puro de substituição e também o conceito Linux de substituição de variável (substituir uma variável por seu valor por execução), mas ainda perdi o objetivo desse recurso de shell da documentação para qualquer coisa razão ou grupo de razões.


Minha resposta após a pergunta bloqueada

A substituição de comandos é uma operação com sintaxe dedicada tanto para executar um comando quanto para manter a saída desse comando (armazenada) por uma variável para uso posterior.

Um exemplo com date:

thedate="$(date)"

Podemos então imprimir o resultado usando o comando printf:

printf 'The date is %s\n' "$thedate"
  1. A sintaxe de substituição do comando é $().
  2. O comando em si é date.
  3. Combinando ambos obtemos $(date), seu valor é o resultado da substituição (que poderíamos obter após a execução ).
  4. Salvamos esse valor em uma variável, $thedate, para uso posterior.
  5. Exibimos o valor de saída mantido pela variável com printf, conforme o comando acima.

Nota: \nin printfé uma quebra de linha.

command-substitution
  • 2 2 respostas
  • 53489 Views

2 respostas

  • Voted
  1. Best Answer
    Kusalananda
    2018-04-26T21:48:02+08:002018-04-26T21:48:02+08:00

    "Substituição de comando" é o nome do recurso da linguagem shell que permite executar um comando e fazer com que a saída desse comando substitua (substitua) o texto do comando.

    Não há nenhum outro recurso da linguagem shell que permita fazer isso.

    Uma substituição de comando, ou seja, a $(...)expressão inteira, é substituída por sua saída, que é o uso principal das substituições de comando.

    O comando que a substituição de comando executa é executado em um subshell, o que significa que ele possui seu próprio ambiente que não afetará o ambiente do shell pai.

    Nem todas as execuções de subshell são substituições de comando (veja mais exemplos no final).

    Exemplo mostrando que uma substituição de comando é executada em um subshell:

    $ s=123
    $ echo "hello $( s=world; echo "$s" )"
    hello world
    $ echo "$s"
    123
    

    Aqui, a variável sé definida como string 123. Na próxima linha, echoé invocado em uma string contendo o resultado de uma substituição de comando. A substituição do comando define sa string worlde ecoa essa string. A string worldé a saída do comando na substituição do comando e assim, se fosse executado sob set -x, veríamos que a segunda linha acima teria sido expandida para echo 'hello world', que produz hello worldno terminal:

    $ set -x
    $ echo "hello $( s=world; echo "$s" )"
    ++ s=world
    ++ echo world
    + echo 'hello world'
    hello world
    

    ( bashadiciona um nível extra de +prompts a cada nível de um subshell de substituição de comando na saída de rastreamento, outros shells podem não fazer isso)

    Por fim, mostramos que o comando dentro da substituição de comando foi executado em seu próprio subshell, porque não afetou o valor de sno shell de chamada (o valor de sainda é 123, não world).

    Existem outras situações em que os comandos são executados em subshells, como em

    echo 'hello' | read message
    

    Em bash, a menos que você defina a lastpipeopção (somente em instâncias não interativas), o readé executado em um subshell, o que significa que $messagenão será alterado no shell pai, ou seja, fazer echo "$message"após o comando acima ecoará uma string vazia (ou qualquer valor $messageera antes).

    Uma substituição de processo bashtambém é executada em um subshell:

    cat < <( echo 'hello world' )
    

    Isso também é diferente de uma substituição de comando.

    • 27
  2. Vlastimil Burián
    2018-04-26T20:17:58+08:002018-04-26T20:17:58+08:00
    a=$(command)
    

    armazenará o valor do resultado commandna variável.

    Não há realmente mais do que isso.

    Como nota lateral, acredito:

    a=`command`
    

    foi descontinuado e tem o mesmo significado acima.

    • 0

relate perguntas

  • Como fazer a substituição bash $(<"filename") silenciosa

  • Substituição ruim: sem fechamento "`" em um heredoc / EOF

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 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

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 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
    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
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +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
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +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