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 / 问题

All perguntas(unix)

Martin Hope
Sergiy Kolodyazhnyy
Asked: 2019-06-25 01:10:32 +0800 CST

Por que um grupo de comandos de chave precisa de espaços após a chave de abertura no POSIX Shell Grammar?

  • 12

TL; DR : Por que o grupo de chaves POSIX precisa de espaços após a {palavra reservada, mas o subshell não após a palavra reservada (?

A gramática do shell POSIX define o grupo de chaves e o subshell da seguinte maneira

brace_group      : Lbrace compound_list Rbrace

subshell         : '(' compound_list ')'

Agora, se estivermos lendo isso literalmente, os espaços são significativos. Isso significaria que deve haver espaço delimitando abertura e fechamento de chave e parênteses como em

{ echo hello world; }

( echo hello world )

Isso também se alinharia com as definições do Comando Composto :

Cada um desses comandos compostos tem uma palavra reservada ou operador de controle no início e uma palavra reservada ou operador de terminação correspondente no final.

No entanto, o que não faz sentido é porque (list)e ( list )funciona bem (esse espaço depois (não é necessário), no entanto, a expansão do brace tem que ter um espaço à esquerda, ou seja {echo hello;}, não funcionaria.

É claro que a palavra reservada sendo tratada como palavra shell faria sentido precisar de um espaço depois para se alinhar ao conceito de divisão de campo , no entanto, a própria definição não faz menção a espaços. Além disso, se {e (ambos são considerados palavras reservadas pela definição POSIX do comando composto, por que eles são tratados de maneira diferente em relação ao caractere de espaço após essas palavras reservadas? Agora, o manual do ksh(1) declara:

As palavras, que são sequências de caracteres, são delimitadas por caracteres de espaço em branco sem aspas (espaço, tabulação e nova linha) ou metacaracteres (<, >, |, ;, &, ( e ))

Em outras palavras, faz sentido que o ksh reconheça (como delimitador de palavras, onde a primeira palavra seria um comando ou atribuição de variável. POSIX, no entanto, não parece ser mencionado (como meta-caractere. A única explicação possível que encontrei no que diz respeito à gramática POSIX é que {é considerado um "token", onde as (não é listado como um.

/* These are reserved words, not operator tokens, and are
   recognized when reserved words are recognized. */


%token  Lbrace    Rbrace    Bang
/*      '{'       '}'       '!'   */

Então, qual seria o raciocínio preciso para essa discrepância?

Notas de resposta aceitas:

  • Movida a marca de seleção aceita para a resposta de Isaac, pois fornece uma citação do próprio padrão que aborda diretamente minha pergunta:

    Por exemplo, '(' e ')' são operadores de controle, de modo que não <space>é necessário em (lista). No entanto, '{' e '}' são palavras reservadas em { list;}, de modo que, neste caso, o e principal <space>e <semicolon>são obrigatórios.

  • Aceitando a resposta de Kusalananda . A resposta de Kusalananda atende ao que eu precisava, embora principalmente do ponto de vista informal e intuitivo; aponta {é uma palavra reservada e (é operador. Michael Homer também observou o mesmo nos comentários - que a definição do Comando Composto afirma (ênfase adicionada):

    Cada um desses comandos compostos tem uma palavra reservada ou operador de controle no início

  • {são definidos como palavras reservadas, semelhantes a forou while, listadas na Shell Grammar (veja o último bloco de código na pergunta)

  • A seção 2.9 declara (ênfase adicionada):

    Em particular, as representações incluem espaçamento entre tokens em alguns lugares onde <blank>s não seria necessário (quando um dos tokens é um operador).

  • Enquanto o padrão não define explicitamente (como um operador, (é referido como operador; especificamente, a seção 2.9.2 diz

    Se o pipeline começar com a palavra reservada ! e command1 é um comando de subshell, o aplicativo deve garantir que o operador ( no início de command1 seja separado do ! por um ou mais caracteres. O comportamento da palavra reservada ! imediatamente seguido pelo operador ( não é especificado.

  • A pergunta sobre o Stack Overflow por Digital Trauma aponta a Seção 2.4 sobre Palavras Reservadas:

    Este reconhecimento só ocorrerá quando nenhum dos caracteres for citado e quando a palavra for utilizada como:

    -A primeira palavra de um comando

  • Como mencionado na resposta de Kusalananda "Os espaços mostrados na gramática POSIX não são espaços que precisam estar lá nos dados de entrada do shell, mas apenas uma maneira de exibir a própria gramática. É o fato de as chaves serem palavras reservadas que implica que eles precisam ser cercados por espaços em branco" Como mencionado por Michael Homer nos comentários: "Se os espaços fossem significativos por si só, eles precisariam ser listados na produção "

Caso encerrado.

shell posix
  • 2 respostas
  • 1027 Views
Martin Hope
Diane Wilbor
Asked: 2019-06-20 00:04:17 +0800 CST

Parametrizar chamadas encadeadas para um programa utilitário no Bash

  • 12

Eu tenho um programa UNIX de caixa preta usado em um shell Bash que lê colunas de dados de stdin, os processa (aplicando um efeito de suavização) e depois envia para stdout. Eu uso por pipes UNIX, como

generate | smooth | plot  

Para mais suavização, posso repetir a suavização, para que seja invocada na linha de comando do Bash como

generate | smooth | smooth | plot   

ou mesmo

generate | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | plot

Isso está ficando desagradável. Eu gostaria de fazer um wrapper Bash para poder canalizar smoothe alimentar sua saída de volta em uma nova instância de smoothum número arbitrário de vezes, algo como

generate | newsmooth 5 | plot

ao invés de

generate | smooth | smooth | smooth | smooth | smooth | plot

Minha primeira tentativa foi um script Bash que gerou arquivos temporários no diretório atual e os excluiu, mas ficou feio quando eu não estava em um diretório com acesso de gravação e também deixou arquivos de lixo quando interrompido.

Não há argumentos para o smoothprograma.

Existe uma maneira mais elegante de "empacotar" esse programa para parametrizar o número de chamadas?

bash shell-script
  • 2 respostas
  • 662 Views
Martin Hope
Kusalananda
Asked: 2019-06-06 08:34:30 +0800 CST

Comportamento de "eval" sob "set -e" em expressão condicional

  • 12

Considere os comandos

eval false || echo ok
echo also ok

Normalmente, esperamos que isso execute o falseutilitário e, como o status de saída é diferente de zero, execute echo oke echo also ok.

Em todos os shells do tipo POSIX que eu uso ( ksh93, zsh, bash, dash, OpenBSD kshe yash), é isso que acontece, mas as coisas ficam interessantes se habilitarmos o set -e.

Se set -eestiver em vigor, o OpenBSD she os kshshells (ambos derivados de pdksh) encerrarão o script ao executar o eval. Nenhum outro shell faz isso.

O POSIX diz que um erro em um utilitário interno especial (como eval) deve fazer com que o shell não interativo seja encerrado. Não tenho certeza se a execução falseconstitui "um erro" (se fosse, seria independente de set -eestar ativo).

A maneira de contornar isso parece ser colocar o evalem um sub shell,

( eval false ) || echo ok
echo also ok

A questão é se eu devo ter que fazer isso em um shell script POSIX-ly correto, ou se é um bug no shell do OpenBSD? Além disso, o que significa "erro" no texto POSIX vinculado acima?


Informações extras: Os shells do OpenBSD executarão echo okambos com e sem set -e no comando

eval ! true || echo ok

Meu código original parecia

set -e
if eval "$string"; then
    echo ok
else
    echo not ok
fi

que não sairia not okcom string=falseo uso dos shells do OpenBSD (ele terminaria), e eu não tinha certeza se era por design, por engano ou por mal-entendido, ou qualquer outra coisa.

posix openbsd
  • 2 respostas
  • 675 Views
Martin Hope
thePhonenix18
Asked: 2019-06-01 02:20:05 +0800 CST

Acidentalmente renomeado arquivo tar.gz para um arquivo não tar.gz, meu arquivo ficará confuso

  • 12

Eu estava tentando mover um tar.gzarquivo para o /optdiretório e acidentalmente movê-lo /root/optpensando que era o lugar certo. Mas não havia /root/opt, então o tar.gzarquivo foi renomeado para optdentro da /rootpasta.

Eu o renomeei de volta para o tar.gzarquivo; meus arquivos serão bagunçados? Estou preocupado se isso ainda estaria bem.

linux root
  • 1 respostas
  • 2102 Views
Martin Hope
Gabriel Diego
Asked: 2019-05-31 13:11:21 +0800 CST

Como dividir uma string em duas substrings de mesmo comprimento usando o bash?

  • 12

Eu gostaria de dividir uma string em duas metades e imprimi-las sequencialmente. Por exemplo:

abcdef

em

abc
def

Existe uma maneira simples de fazer isso ou precisa de algum processamento de string?

bash string
  • 4 respostas
  • 5078 Views
Martin Hope
HdM Upload
Asked: 2019-05-27 14:50:35 +0800 CST

desligamento em data específica

  • 12

Eu sei que você pode agendar um desligamento para um horário específico via shutdown -h 21:45e que você não deve usar crontabs para essas coisas por causa de sua natureza repetitiva. Como posso agendar um desligamento para uma data específica, como 31 de agosto às 20h?

ubuntu shutdown
  • 6 respostas
  • 3492 Views
Martin Hope
Rocky86
Asked: 2019-05-14 17:47:21 +0800 CST

Como renomear vários arquivos em um diretório ao mesmo tempo

  • 12

Eu tenho o diretório dizer /var/tmp/abcque tem 4 arquivos:

12345-ram-3e3r5-io9490-89adu9.csv
45434-dam-qwe35-to9490-43adu9.csv
11234-cam-yy3r5-ro9490-85adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv

Eu quero renomear todos os arquivos CSV (encontrar todos os arquivos e renomeá-los) da maneira mais curta possível (provavelmente uma linha) para isso:

XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv
shell files
  • 4 respostas
  • 2538 Views
Martin Hope
DrM
Asked: 2019-05-10 06:31:00 +0800 CST

Quais comandos são executados por ALT+F2 e "r"?

  • 12

Na área de trabalho do Cinnamon:

  • Qual comando ou código é executado em resposta a Alt+ F2?
  • Em qual arquivo esta associação é armazenada?
  • Qual comando ou código é executado em resposta ao rcomando na janela do prompt de comando aberta por Alt+ F2?
cinnamon gnome-shell
  • 2 respostas
  • 6076 Views
Martin Hope
James
Asked: 2019-04-28 08:16:02 +0800 CST

O que significa a capacidade "ep"?

  • 12
root@macine:~# getcap ./some_bin
./some_bin =ep

O que significa "ep"? Quais são as capacidades deste binário?

linux capabilities
  • 2 respostas
  • 9040 Views
Martin Hope
Seninha
Asked: 2019-04-28 04:48:06 +0800 CST

Como fazer um pipeline aguardar o fim do arquivo ou parar após um erro?

  • 12

Eu tentei o seguinte comando depois de assistir a este vídeo sobre travessuras de tubos.

man -k . | dmenu -l 20 | awk '{print $1}' | xargs -r man -Tpdf | zathura -

Ele basicamente imprime uma lista de manpages no dmenu para o usuário selecionar um deles, então ele usa xargs para executar man -Tpdf %(imprimir para stdout um pdf da manpage git da entrada do xargs) e passar o pdf para um leitor de pdf (zathura ).

O problema é que (como você pode ver no vídeo) o leitor de pdf inicia antes mesmo de eu selecionar uma página de manual no dmenu. E se eu clicar em Esc e não selecionar nenhum, o leitor de pdf ainda estará aberto, não mostrando nenhum documento.

Como posso fazer com que o leitor de pdf (e qualquer outro comando em uma cadeia de pipe) seja executado apenas quando sua entrada atingir um final de arquivo ou quando receber uma entrada? Ou, alternativamente, como posso fazer uma cadeia de pipe parar depois que um dos comandos encadeados retornar um status de saída diferente de zero (para que, se o dmenu retornar um erro por não selecionar uma opção, os comandos a seguir não sejam executados)?

shell-script scripting
  • 3 respostas
  • 2131 Views
Prev
Próximo

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