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 / computer / Perguntas / 1460513
Accepted
WestCoastProjects
WestCoastProjects
Asked: 2019-07-17 08:37:22 +0800 CST2019-07-17 08:37:22 +0800 CST 2019-07-17 08:37:22 +0800 CST

Usar "$@" na função bash tem um resultado diferente do que executar o comando diretamente no bash

  • 772

Ao executar historyna linha de comando, os resultados são assim:

$history aws s3 cp
16160  aws s3 cp s3://mybucket/air2008/10 .
16254  hists "aws s3 cp"

Para uma função histsque se destina a ser um atalho para o acima:

type hists
hists is a function
hists ()
{
    history 15000 | grep "$@"
}

Ao executá-lo, obtemos

09:40:44/csv $hists aws s3 cp
grep: s3: No such file or directory
grep: cp: No such file or directory

Se o executarmos com aspas, ele obterá o resultado correto. Mas então as citações são obrigatórias?

bash
  • 2 2 respostas
  • 32 Views

2 respostas

  • Voted
  1. Best Answer
    Daniel B
    2019-07-17T09:32:59+08:002019-07-17T09:32:59+08:00

    $hists "aws s3 cp"“expande” para history 15000 | grep "aws s3 cp". Isso significa que greprecebe um único argumento.

    $hists aws s3 cpexpande para history 15000 | grep "aws" "s3" "cp". greprecebe três argumentos.

    O primeiro argumento para grepé o padrão. Os outros argumentos são arquivos nos quais grepencontrar o padrão. Não há arquivos chamados s3ou cpna pasta atual, portanto, grepexibe mensagens de erro.

    As aspas podem alterar o significado do texto na linha de comando. Se você deseja que um argumento contenha espaços em branco, as aspas são uma maneira de fazer isso.

    $hosts aws\ s3\ cpfaz a mesma coisa: adicionando uma barra invertida antes do espaço em branco, o shell sabe que não deve usar o significado usual, que é separar argumentos. Em vez disso, ele se tornará um espaço em branco literal.

    Também não há diferença de comportamento com "$@". Ela existe precisamente para preservar os argumentos citados.

    • 3
  2. Kamil Maciorowski
    2019-07-18T01:00:49+08:002019-07-18T01:00:49+08:00

    A outra resposta é boa. Ele explica o que aconteceu:

    hists aws s3 cpexpande para history 15000 | grep "aws" "s3" "cp". greprecebe três argumentos.

    O primeiro argumento para grepé o padrão. Os outros argumentos são arquivos nos quais grepencontrar o padrão. Não há arquivos chamados s3ou cpna pasta atual, portanto, grepexibe mensagens de erro.

    Minha resposta permitirá que você robusteça e modifique a função para hists aws s3 cpque funcione.


    A primeira nota grep "$@"em seu código original permite que você injete opções para grep, assim:

    hists -i LS
    

    Você pode ou não querer ser capaz de fazer isso. Caso contrário, o trecho de código deve ser grep -- "$@". Mas mesmo assim você poderá passar nomes de arquivos para grep. Espero que você nunca queira que grepa função opere em arquivos. Algum mecanismo para evitar isso seria útil.

    Se você quiser injetar opções, não há uma maneira trivial de impedir que você especifique arquivos como argumentos adicionais. A função deve passar vários argumentos para grep; ele não sabe por si só qual é uma opção, qual é um arquivo. Alguma lógica pode lidar com isso, mas vamos manter as coisas simples.

    Se você pode viver sem injetar opções em grep, pode garantir que a ferramenta receba apenas um argumento, o padrão. Você pode usar grep -- "$1", mas neste caso

    hists aws s3 cp
    

    será equivalente a hists aws, argumentos adicionais não importarão. Isso não é exatamente o que você deseja, mas impedirá grepa análise s3e cp/ou lançamento de erros sobre eles.

    Ou você pode usar grep -- "$*". Isto é o que o POSIX diz sobre "$*":

    Quando a expansão ocorrer em um contexto onde a divisão de campos não será realizada, os campos iniciais devem ser unidos para formar um único campo com o valor de cada parâmetro separado pelo primeiro caractere da IFSvariável se IFScontiver pelo menos um caractere, ou separados por um <espaço> se não for definido IFSou sem separação se IFSfor definido como uma string nula.

    O interior das aspas é "um contexto onde a divisão de campo não será realizada" e o padrão IFScomeça com <espaço>. Isso significa que se você usar grep -- "$*", o comando

    hists aws s3 cp
    

    irá desencadear grep -- "aws s3 cp", que é o que você queria em primeiro lugar. Observe que você obterá o mesmo resultado com

    hists aws  s3           cp
    

    apesar dos vários espaços. O ponto é histsque não vê esses espaços. Ele vê aws, s3e cpcomo argumentos separados, então o mecanismo de "$*"concatena as três strings usando espaços simples.

    Por outro lado, estes comandos:

    hists "aws s3 cp"
    hists "aws  s3           cp"
    

    funcionará exatamente como você esperaria, independentemente de você usar grep -- "$*"ou grep -- "$@"ou grep -- "$1". As três variantes se comportam de maneira diferente quando há mais argumentos para hists; ou menos (tente histssem nenhum argumento).

    Assim grep -- "$*", você pode tornar as aspas opcionais em alguns casos. Essa variante também impedirá grepa análise de arquivos, independentemente do que você digitar.

    • 1

relate perguntas

  • substituindo zsh por bash no usuário não root

  • Tendo problemas para definir variáveis ​​de ambiente no Terminal no macOS High Sierra

  • Existe um equivalente a cd - para cp ou mv?

  • Notificar-enviar notificações aparecendo na janela

  • como abrir um arquivo de escritório do WSL

Sidebar

Stats

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

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    Serviço do Windows 10 chamado AarSvc_70f961. O que é e como posso desativá-lo?

    • 2 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Marko Smith

    ssl.SSLCertVerificationError: falha na verificação do certificado [SSL: CERTIFICATE_VERIFY_FAILED]: não foi possível obter o certificado do emissor local (_ssl.c:1056)

    • 4 respostas
  • Marko Smith

    Como posso saber em qual unidade o Windows está instalado?

    • 6 respostas
  • Martin Hope
    Albin Como faço para ativar o WindowsXP agora que o suporte acabou? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 O "HTTPS Everywhere" ainda é relevante? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch O Windows 10 exclui muitos arquivos minúsculos muito lentamente. Algo pode ser feito para agilizar? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Como Ctrl+C e Ctrl+V funcionam? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

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