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 / user-273175

Harold Fischer's questions

Martin Hope
Harold Fischer
Asked: 2020-01-25 14:18:40 +0800 CST

Por que devo chamar sed uma segunda vez depois de substituir espaços por novas linhas?

  • 1

Dado um arquivo, quero fazer uma lista de todos os bytes que ele contém em formato octal, cada byte em sua própria linha.

Por que isso funciona:

#!/bin/sh --

newline='
'

od -v -A n -t o1 -- /tmp/file | \
sed -e "s/ /\\${newline}/g" | \
sed -e '/^$/d'

e não isso:

#!/bin/sh --

newline='
'

od -v -A n -t o1 -- /tmp/file | \
sed -e "s/ /\\${newline}/g" -e '/^$/d'

Por que eu tenho que ligar para o sed duas vezes separadas para fazer o trabalho?

Para referência, a saída de od, sem processamento adicional, pode ser algo como o seguinte:

         047 124 167 141 163 040 142 162 151 154 154 151 147 054 040 141
         156 144 040 164 150 145 040 163 154 151 164 150 171 040 164 157
         166 145 163 012 011 104 151 144 040 147 171 162 145 040 141 156
         144 040 147 151 155 142 154 145 040 151 156 040 164 150 145 040
         167 141 142 145 072 012 101 154 154 040 155 151 155 163 171 040
         167 145 162 145 040 164 150 145 040 142 157 162 157 147 157 166
         145 163 054 012 011 101 156 144 040 164 150 145 040 155 157 155
         145 040 162 141 164 150 163 040 157 165 164 147 162 141 142 145
         056 012
sed posix
  • 2 respostas
  • 102 Views
Martin Hope
Harold Fischer
Asked: 2019-12-23 17:39:19 +0800 CST

bc: o POSIX proíbe o uso autônomo de operadores relacionais?

  • 8

Eu quero comparar dois números com bc. De acordo com esta resposta altamente cotada no StackOverflow , posso fazê-lo da seguinte maneira:

printf '%s\n' '1.2 > 0.4' | bc

bcenvia 1para STDOUT, indicando que a declaração é verdadeira (teria retornado 0 se a declaração fosse falsa).

De acordo com a página POSIX parabc :

Ao contrário de todos os outros operadores, os operadores relacionais ( '<', '>', "<=", ">=", "==", "!=" ) devem ser válidos apenas como objeto de um if, while, ou dentro de uma instrução for.

Talvez eu esteja interpretando mal, mas essa linguagem parece não permitir a sintaxe usada no exemplo acima.

O uso autônomo de operadores relacionais é bcuma violação do POSIX? Se sim, como devo reescrever meu exemplo?

posix bc
  • 1 respostas
  • 706 Views
Martin Hope
Harold Fischer
Asked: 2019-12-11 13:27:32 +0800 CST

Qual é a maneira correta de citar expansões de parâmetros aninhados?

  • 2

Ao lidar com expansões de parâmetros aninhados, qual dessas é a maneira correta de citar as coisas?

Este:

var="${var#"${var%%[![:space:]]*}"}"

Ou este:

var="${var#${var%%[![:space:]]*}}"

Eu vi isso feito nos dois sentidos. A primeira variação é um trecho de uma resposta do Stack Overflow . É uma das respostas mais votadas para a pergunta (a pergunta é sobre como cortar o espaço em branco de uma variável).


Também estou tendo problemas para encontrar uma fonte respeitável que aborda como citar coisas ao trabalhar com uma "palavra" ou "padrão" que é uma variável em vez de texto literal. Dos dois abaixo, qual está correto?

Este:

strip_ext="${filename%."$filename_ext"}"

Ou este:

strip_ext="${filename%.$filename_ext}"
shell quoting
  • 2 respostas
  • 262 Views
Martin Hope
Harold Fischer
Asked: 2019-12-03 21:42:52 +0800 CST

O SIGQUIT não tem o efeito de encerrar um script no bash?

  • 2
#!/bin/bash --

echo "$$"

LC_ALL=C sed 's/[!-~]/b/g' /tmp/bigfile > /tmp/outfile

echo end of script

Se eu enviar o QUITsinal usando Ctrl + \recebo esta saída:

# ./script.sh
6739
^\./script.sh: line 5:  6740 Quit                    LC_ALL=C sed 's/[!-~]/b/g' /tmp/bigfile > /tmp/outfile
end of script

Isso mata sede causa um dump de núcleo conforme o esperado, mas o script continua. Este é o comportamento esperado? Isso acontece comigo com bashe ashmas não não dashou ksh93.

bash signals
  • 1 respostas
  • 510 Views
Martin Hope
Harold Fischer
Asked: 2019-11-20 12:43:04 +0800 CST

Como posso ter certeza de que uma string contém pelo menos uma letra maiúscula, uma letra minúscula, um número e um caractere de pontuação?

  • 5

Isto é o que estou usando agora para fazer o trabalho:

#!/bin/sh --

string='Aa1!z'

if ! printf '%s\n' "$string" | LC_ALL=C grep -q '[[:upper:]]' || \
   ! printf '%s\n' "$string" | LC_ALL=C grep -q '[[:lower:]]' || \
   ! printf '%s\n' "$string" | LC_ALL=C grep -q '[[:digit:]]' || \
   ! printf '%s\n' "$string" | LC_ALL=C grep -q '[[:punct:]]'; then
  printf '%s\n' 'String does not meet your requirements'
else
  printf '%s\n' 'String meets your requirements'
fi

Isso é extremamente ineficiente e verboso. Existe uma maneira melhor de fazer isso?

shell
  • 9 respostas
  • 4961 Views
Martin Hope
Harold Fischer
Asked: 2019-05-21 16:41:24 +0800 CST

Por que o GNU `su` não respeita o fim das opções?

  • 0

Quando eu corro

user@hostname:~$ su -- root -z

eu recebo

bash: -z: invalid option
Usage:  bash [GNU long option] [option] ...
...

O acima é o comportamento que eu espero.

Quando eu corro

user@hostname:~$ su -l -- root -z

eu recebo

-su: -z: invalid option
Usage:  -su [GNU long option] [option] ...
...

Eu uso a opção inválida -zapenas para demonstrar qual comando está analisando a opção.

Esse comportamento me irrita sem fim. sucontinuei procurando opções depois que declarei fim das opções. Estou faltando alguma coisa, isso é um bug ou apenas um design horrível?

su gnu
  • 1 respostas
  • 197 Views
Martin Hope
Harold Fischer
Asked: 2019-04-20 22:17:57 +0800 CST

dash: por que estou recebendo o erro "Erro de sintaxe: EOF na substituição de aspas" quando meu script nem contém uma aspas?

  • 3
#!/bin/sh --

for set_trap_sig in HUP INT QUIT ALRM TERM; do
    trap -- '
        trap -- - '"${set_trap_sig:?}"' EXIT || exit "$?"
        kill -s '"${set_trap_sig:?}"' -- "$$" || exit "$?"' "$set_trap_sig"
done

sleep 15 || exit "$?"

Aqui está o que acontece quando eu envio SIGINT para o script

user@hostname:/tmp$ ./script.sh
^C./script.sh: 3: ./script.sh: Syntax error: EOF in backquote substitution

Este problema parece específico para dash. No ash, bash e ksh93, não recebo esse erro. Isso é particularmente estranho porque meu script nem contém o caractere backquote.

Se eu remover as aspas duplas no final $?da linha 5, o erro desaparece.

Estou fazendo algo estúpido ou o Dash está sendo retardado? E sim, eu sei que escrevo roteiros como um esquizofrênico paranóico.

Edit: estabelecemos um bug muito sério que afeta até as versões modernas do Ubuntu e do Debian. Alguém sabe de uma solução alternativa?

shell quoting
  • 1 respostas
  • 5506 Views
Martin Hope
Harold Fischer
Asked: 2019-01-16 20:19:55 +0800 CST

Quais caracteres precisam ser escapados ao usar o comando printf?

  • 11

Quero esclarecer que não estou falando sobre como escapar caracteres no nível de interpretação do shell.

Tanto quanto eu posso dizer, apenas dois caracteres precisam ser escapados: %e\

Para imprimir um literal %, você deve escapá-lo com um precedente %:

printf '%%'

Para imprimir um literal \, você deve escapá-lo com um precedente \:

printf '\\'

Existem outras instâncias em que eu precisaria escapar de um caractere para que ele fosse interpretado literalmente?

shell posix
  • 2 respostas
  • 17566 Views
Martin Hope
Harold Fischer
Asked: 2019-01-09 20:32:52 +0800 CST

O comportamento de escapar caracteres especiais entre aspas duplas em shells compatíveis com POSIX está em desacordo com o POSIX?

  • 0

De acordo com a página de linguagem de comando POSIX Shell :

\

O <backslash>deve manter seu significado especial como um caractere de escape (consulte Caractere de escape (barra invertida)) somente quando seguido por um dos seguintes caracteres quando considerado especial :

$ ` " \ <newline>

Eu interpreto isso como significando que \só deve escapar um desses cinco caracteres especiais se for especial em seu determinado contexto.

As páginas man para ash, dash, bash e ksh não contêm a cláusula "quando consideradas especiais". Eu entendo que isso significa (e confirmei através de experimentação básica) que \tem o efeito de escapar desses cinco caracteres incondicionalmente, mesmo quando um desses cinco caracteres não é especial em seu contexto.

Considere a saída de $ printf '%s\n' "\abcde", que é \abcde. Isso é esperado porque anão é especial neste contexto (ou em qualquer contexto para esse assunto); portanto, o \não é especial e é tratado literalmente.

Agora considere a saída de $ printf '%s\n' "\\abcde", que é \abcde. Este não é o comportamento que eu espero. Na minha opinião, a primeira barra invertida na string \\abcdetambém deve ser tratada literalmente, porque é seguida por \um contexto em que \não é especial. A saída que eu esperaria é \\abcde.

Outro cenário em que vejo um comportamento inesperado está na saída de $ printf '%s\n' "ab\$", que é ab$. Na minha opinião, $tem um significado especial neste contexto porque serve para introduzir expansão de parâmetros, substituição de comandos ou expansão aritmética. Portanto, na minha opinião, o \deve ser tratado literalmente porque é seguido por $um contexto onde $não é especial. A saída que eu esperaria é ab\$.

Para que conste, espero estar totalmente fora da base aqui. Torna minha vida muito mais difícil ter que me preocupar em escapar desses cinco personagens apenas em certas circunstâncias. Eu me esforço para ser posixly correto sempre que possível, e não quero depender de \escapar desses cinco caracteres especiais incondicionalmente se esse comportamento (pessoalmente desejado) em shells compatíveis com POSIX não estiver alinhado com POSIX.

shell quoting
  • 2 respostas
  • 443 Views
Martin Hope
Harold Fischer
Asked: 2018-12-18 23:37:26 +0800 CST

Por que o comportamento da sintaxe `#!` não é especificado pelo POSIX?

  • 16

Na página Shell Command Language da especificação POSIX:

Se a primeira linha de um arquivo de comandos shell começar com os caracteres "#!", os resultados não serão especificados.

Por que o comportamento de #!não especificado pelo POSIX? Acho desconcertante que algo tão portátil e amplamente usado tenha um comportamento não especificado.

shell posix
  • 3 respostas
  • 2552 Views
Martin Hope
Harold Fischer
Asked: 2018-05-31 12:55:10 +0800 CST

Ao imprimir uma variável que contém novas linhas, por que a última nova linha é removida? [duplicado]

  • 9
Essa pergunta já tem respostas aqui :
Por que a substituição de comando do shell engole um caractere de nova linha à direita? (5 respostas)
Fechado há 4 anos .

Conteúdo do arquivo.txt (sem estranheza, arquivo de texto conforme definido pelo POSIX)

iguana
gecko
anole

Exemplo de roteiro:

#!/bin/sh

string="$(cat file.txt)"

printf '%s' "$string"

Exemplo de saída:

[coolguy@somemachine ~]$ ./script.sh
iguana
gecko
anole[coolguy@somemachine ~]$

O que aconteceu com a última nova linha? Por que todas as novas linhas, exceto a última, são preservadas? Parece que não deveríamos ter que usar echo para adicionar uma nova linha se já deveria haver uma lá.

shell command-substitution
  • 1 respostas
  • 1591 Views
Martin Hope
Harold Fischer
Asked: 2018-05-27 16:55:14 +0800 CST

Quais condições devem ser atendidas para que um arquivo seja um arquivo de texto conforme definido pelo POSIX?

  • 30

O POSIX define um arquivo de texto como:

Um arquivo que contém caracteres organizados em zero ou mais linhas. As linhas não contêm caracteres NUL e nenhuma pode exceder {LINE_MAX} bytes de comprimento, incluindo o caractere <nova linha>. Embora o POSIX.1-2017 não faça distinção entre arquivos de texto e arquivos binários (consulte o padrão ISO C), muitos utilitários produzem apenas uma saída previsível ou significativa ao operar em arquivos de texto. Os utilitários padrão que possuem tais restrições sempre especificam "arquivos de texto" em suas seções STDIN ou INPUT FILES.

Fonte: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403

No entanto, há várias coisas que não acho claras:

  1. Um arquivo de texto deve ser um arquivo normal? No trecho acima, não diz explicitamente que o arquivo deve ser um arquivo regular

  2. Um arquivo pode ser considerado um arquivo de texto se contiver um caractere e apenas um caractere (ou seja, um único caractere que não termine com uma nova linha)? Sei que essa pergunta pode parecer complicada, mas eles usam a palavra "caracteres" em vez de "um ou mais caracteres". Outros podem discordar, mas se eles querem dizer "um ou mais personagens", acho que deveriam dizer isso explicitamente

  3. No trecho acima, faz referência a "linhas". Encontrei quatro definições com linha em seu nome: "Linha Vazia", ​​"Linha de Exibição", "Linha Incompleta" e "Linha". Devo inferir que eles significam "Linha" por causa da omissão de "Vazio", "Exibir" e "Incompleto" - ou todas as quatro dessas definições são consideradas uma linha no trecho acima?

Todas as perguntas que vêm após este bloco de texto dependem da inferência de que "caracteres" significa "um ou mais caracteres":

  1. Posso inferir com segurança que, se um arquivo estiver vazio, não é um arquivo de texto porque não contém um ou mais caracteres?

Todas as perguntas que vêm após este bloco de texto dependem da inferência de que no trecho acima, uma linha é definida como "Linha", e que as outras três definições que contêm "Linha" em seu nome devem ser excluídas:

  1. O "zero" em "zero ou mais linhas" significa que um arquivo ainda pode ser considerado um arquivo de texto se contiver um ou mais caracteres que não sejam terminados com nova linha?

  2. "Zero ou mais linhas" significa que uma vez que uma única "Linha" (0 ​​ou mais caracteres mais uma nova linha de terminação) entra em jogo, torna-se ilegal que a última linha seja uma "Linha incompleta" (uma ou mais linhas não caracteres de nova linha no final de um arquivo)?

  3. "Nenhum [nenhuma linha] pode exceder {LINE_MAX} bytes de comprimento, incluindo o caractere de nova linha" significa que há uma limitação para o número de caracteres permitidos em qualquer "Linha" em um arquivo de texto (como um aparte, o valor de LINE_MAX no Ubuntu 18.04 e FreeBSD 11.1 é "2048")?

files posix
  • 2 respostas
  • 3190 Views
Martin Hope
Harold Fischer
Asked: 2018-05-26 09:44:55 +0800 CST

Ao criar um arquivo vazio, por que alguém pode preferir 'arquivo de toque' em vez de ': >> arquivo'?

  • 34

Nunca percebi que você poderia fazer isso até agora:

: >> file

Parece ser funcionalmente semelhante a:

touch file

Existe uma razão pela qual a maioria dos recursos parece preferir tocar esse shell integrado?

shell files
  • 4 respostas
  • 5400 Views

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