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-116858

Kusalananda's questions

Martin Hope
Kusalananda
Asked: 2024-09-15 21:01:30 +0800 CST

O cronograma do crontab no Alpine Linux é executado em dias em que não deveria ser executado

  • 21

Tenho uma programação no meu crontab pessoal em um sistema Alpine Linux 3.20 que roda às 00:10 de terça a domingo (ou seja, todos os dias da semana, exceto segundas-feiras):

10 0 * * 2-7  "$HOME/local/sbin/backup.sh" prune-daily

Isso parece disparar nas segundas-feiras também. Por quê?


Note que meu relatório inicial deu os sintomas como "Não roda aos domingos". Eu me lembrei errado do que aconteceu, desculpe. Corrigi a descrição dos sintomas após investigá-los mais a fundo. O cronograma do crontab está correto, como estava desde o início.

cron
  • 1 respostas
  • 1205 Views
Martin Hope
Kusalananda
Asked: 2024-09-01 02:05:16 +0800 CST

No editor Vim, quero habilitar o Github Copilot manualmente e desabilitá-lo por padrão

  • 5

Se alguém instalar o software Github Copilot para o editor Vim, ele habilitará o copiloto por padrão, o que pode ser visto como um problema de privacidade.

Quero desabilitar o copiloto por padrão e habilitá-lo manualmente no :Copilot enableeditor somente quando necessário.

Como posso fazer isso?

vim
  • 2 respostas
  • 61 Views
Martin Hope
Kusalananda
Asked: 2024-07-14 23:53:27 +0800 CST

Seja notificado sobre novos e-mails em qualquer caixa de entrada do Maildir em ~/Mail, no shell Zsh

  • 6

Eu tenho um cron job que busca novos emails de vários servidores de email a cada 20 minutos. O e-mail é classificado automaticamente nas caixas de correio Maildir em uma hierarquia sob ~/Mail.

Quero ser notificado no shell se uma nova mensagem chegar em qualquer caixa de correio local nos últimos 20 minutos.

Estou usando o zshshell.

zsh
  • 2 respostas
  • 58 Views
Martin Hope
Kusalananda
Asked: 2024-07-05 20:37:24 +0800 CST

Simule discos lentos no KVM para ver o efeito do cache LVM na configuração de teste

  • 8

Estou configurando um sistema Linux em KVM (QEMU) para testar o efeito de adicionar um cache LVM de write-back em um disco rápido na frente de um volume lógico que reside em um conjunto de discos muito lentos (um RAID1 LV). Isso é modelado em uma configuração física real que não quero tocar até saber como ela pode lidar com o cache adicionado.

O problema é que no KVM todos os discos funcionam na mesma velocidade, portanto o cache raramente é utilizado e não vejo nenhum benefício de desempenho. Idealmente, quero que o espelho RAID1 tenha dificuldades com E/S, permitindo-me observar o volume do cache sendo preenchido durante as gravações e gradativamente gradativamente no conjunto de espelhos.

Existe uma maneira de acelerar artificialmente a velocidade de um disco no KVM/QEMU?

Atualmente estou usando o Debian 12 como host para este experimento, com a máquina KVM rodando Alpine Linux (e também testando com o Debian 12). A configuração do KVM inclui uma imagem qcow2 principal (o disco rápido) e imagens qcow2 adicionais (o espelho RAID lento).

lvm
  • 3 respostas
  • 262 Views
Martin Hope
Kusalananda
Asked: 2023-09-06 14:46:04 +0800 CST

Defina a pasta de salvamento padrão do Mutt dependendo da pasta atual

  • 7

No Mutt, ao ler mensagens na pasta =account1/Unsortedou =account1/Importantem qualquer outra subpasta em =account1/, gostaria que a pasta padrão para salvar (aquela sugerida ao pressionar sno índice da mensagem) fosse =account1/INBOX.

Da mesma forma, para subpastas de =account2/, eu gostaria que a pasta padrão para salvar fosse =account2/INBOX, etc.

Como posso configurar o Mutt para fazer isso?

  • Parece que save-hookteria sido útil se houvesse uma maneira de corresponder ao nome da pasta (acho que não).
  • Parece que folder-hookteria sido útil se houvesse uma maneira de definir a pasta de salvamento, mas não há configuração de pasta de salvamento para definir com o gancho (há record, mas é para mensagens de saída).
configuration
  • 1 respostas
  • 32 Views
Martin Hope
Kusalananda
Asked: 2023-08-30 22:15:19 +0800 CST

Marcar e-mails com "notmuch" marca-os como antigos

  • 5

Depois de sincronizar minhas caixas de entrada maildir locais offlineimape realizar a filtragem e classificação de spam usando fdm+ bogofilter, eu marquei as mensagens no armazenamento de correio usando notmuch.

Até recentemente, eu usava o seguinte código shell para marcar e remarcar mensagens dependendo de determinados critérios:

notmuch new

tr -s '\t' ' ' <<'END_BATCH' | notmuch tag --batch
-inbox +sent            -- folder:/Sent/
-inbox +archive         -- folder:/Archive/
-inbox +junk            -- folder:/Junk/
+unsorted               -- folder:/INBOX.Unsorted/
-unsorted               -- not folder:/INBOX.Unsorted/
-unread -- tag:archive
+unread -- tag:unsorted
END_BATCH

Isso remove a inboxtag de qualquer mensagem em uma pasta ou , ao mesmo tempo em que marca novamente as mensagens com as tags apropriadas para essas três pastas Sent. Em seguida, ele marca ou desmarca as mensagens dependendo se elas estão em uma pasta (onde coloquei as mensagens que não puderam ser classificadas). Por último, garanto que as mensagens arquivadas não sejam marcadas como e que as mensagens não classificadas sejam marcadas como .ArchiveJunkINBOX.Unsortedbogofilterunreadunread

Isso funcionou bem.

Como recebo e-mails em cinco contas diferentes, também queria adicionar tags como account-somenameetc. account-othernameàs mensagens, dependendo do nome da pasta:

notmuch new

tr -s '\t' ' ' <<'END_BATCH' | notmuch tag --batch
-inbox +sent            -- folder:/Sent/
-inbox +archive         -- folder:/Archive/
-inbox +junk            -- folder:/Junk/
+unsorted               -- folder:/INBOX.Unsorted/
-unsorted               -- not folder:/INBOX.Unsorted/
-unread -- tag:archive
+unread -- tag:unsorted
+account-acc1           -- folder:/acc1/
+account-acc2           -- folder:/acc2/
+account-acc3           -- folder:/acc3/
+account-acc4           -- folder:/acc4/
+account-acc5           -- folder:/acc5/
END_BATCH

A marcação parece ser executada conforme o esperado, mas um efeito colateral é que as novas mensagens são marcadas como antigas (movidas do newdiretório do maildir para o curdiretório). Isso, por sua vez, significa que muttnão detectarei as novas mensagens nas caixas de entrada (a menos que eu defina maildir_check_curna muttconfiguração, o que não acho que seja uma boa solução).

Não sei por que ou o que poderia fazer para impedir que isso acontecesse.

Minha notmuchconfiguração:

[database]
path=/home/myself/Mail/inboxes

[user]
name=myname
primary_email=me@example.com
other_email=otherme@example.com

[new]
tags=inbox;unread

[search]

[maildir]
syncronize_flags=true

[index]
header.List=List-Id
email
  • 1 respostas
  • 30 Views
Martin Hope
Kusalananda
Asked: 2023-04-26 23:26:47 +0800 CST

Como parametrizar uma expressão `jq` para retornar uma seleção ou seu complemento?

  • 6

Vamos supor que tenho duas jqexpressões bastante complexas, mas que diferem apenas porque uma retorna o complemento da outra, ou seja, que a única diferença entre elas é que uma faz select(expression)e a outra faz select(expression|not).

Exemplo simplificado:

$ jq -n '$ARGS.positional[] | select( . > 2 )' --jsonargs 1 2 3 4 5
3
4
5
$ jq -n '$ARGS.positional[] | select( . > 2 | not )' --jsonargs 1 2 3 4 5
1
2

Em vez de repetir essas duas jqexpressões diferentes em meu código (elas têm, na realidade, um punhado de linhas cada), passar um valor para uma única expressão para alternar entre os dois comportamentos seria legal.

Como eu posso fazer isso?


Código real jq(isso filtra as mensagens do RabbitMQ com base em um caminho de arquivo codificado na carga útil das mensagens):

map(
        # Add an array of pathnames that would match this message.  This
        # includes the pathnames of each parent directory, leading up to
        # and including the pathname of the file itself.
        .tmp_paths = [
                # The full pathname is part of a base64-encodod JSON blob.
                foreach (
                        .payload |
                        @base64d |
                        fromjson.filepath |
                        split("/")[]
                ) as $elem (
                        null;
                        . += $elem + "/";
                        .
                )

        ] |
        # The last element is the full file path and should not have a
        # trailing slash.
        .tmp_paths[-1] |= rtrimstr("/")
) |
[
        # Match the pathnames given as positional command line arguments
        # against the computed pathnames in the "tmp_paths" array in
        # each message.  Extract the messages with a match.
        JOIN(
                INDEX($ARGS.positional[]; .);
                .[];
                .tmp_paths[];
                if (.[1:] | any) then
                        .[0]
                else
                        empty
                end
        )
] |
# Deduplicate the extracted messages on the full pathname of the file.
# Then remove the "tmp_paths" array from each message and base64 encode
# them.
unique_by(.tmp_paths[-1])[] |
del(.tmp_paths) |
@base64

Estou assumindo que preciso modificar essa ifinstrução de alguma forma para extrair ou descartar as mensagens cujos caminhos de arquivo correspondem aos nomes de caminho fornecidos como argumentos posicionais.

jq
  • 2 respostas
  • 58 Views
Martin Hope
Kusalananda
Asked: 2023-04-16 20:29:04 +0800 CST

Problema ao visualizar o arquivo compactado com "zless", mas não com "zmore" ou "gunzip -c"

  • 14

No meu sistema FreeBSD 13.2, o zlessutilitário não pode visualizar arquivos de texto compactados com gzipou compress, avisando que podem ser arquivos binários e mostrando lixo se eu disser que quero ver o conteúdo de qualquer maneira. Estranhamente, usar zmoreou gunzip -cparece funcionar.

$ zless znapzend.log.1.gz
"znapzend.log.1.gz" may be a binary file.  See it anyway?

(Responder afirmativamente envia dados binários para o terminal.)

$ zless --version
less 608 (POSIX regular expressions)
Copyright (C) 1984-2022  Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Home page: https://greenwoodsoftware.com/less
$ zmore --version
less 608 (POSIX regular expressions)
Copyright (C) 1984-2022  Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Home page: https://greenwoodsoftware.com/less

Qual é a causa disso?

freebsd
  • 1 respostas
  • 439 Views
Martin Hope
Kusalananda
Asked: 2023-01-18 06:44:58 +0800 CST

/RE/ vs. "RE" em awk

  • 14

Em awk, o primeiro argumento para as funções sub()e gsub(), o segundo argumento para a match()função e o terceiro argumento opcional para split(), é uma expressão regular estendida.

Esse argumento pode ser uma expressão arbitrária avaliada como uma string interpretada como uma expressão regular ou pode ser uma constante de expressão regular.

Em awk, uma constante de expressão regular é escrita /RE/para alguma expressão regular RE(um " EREtoken" na awkgramática).

Pergunta: Supondo que REpermaneça o mesmo (alguma expressão regular não variável), há alguma diferença prática entre using /RE/e using "RE"(um " STRINGtoken" na awkgramática) em uma chamada para, por exemplo, sub()? Como alternativa: Existe alguma awkimplementação conhecida que faça diferença entre essas duas formas de representar uma expressão regular em uma chamada para as funções mencionadas acima?

O motivo da pergunta é que me lembro de ter que modificar algum awkcódigo que tentei usar "RE"como expressão regular em uma chamada para sub()ou gsub(), porque, por qualquer motivo, a awkimplementação em questão fez a coisa errada, a menos que eu chamasse a função com /RE/.

Infelizmente, isso foi há algum tempo (mais de 2 anos), então não me lembro dos detalhes e não tenho certeza de qual Unix eu usava na época (possivelmente OpenBSD), mas desde então venho querendo fazer a pergunta.

awk
  • 1 respostas
  • 424 Views
Martin Hope
Kusalananda
Asked: 2022-06-28 03:16:52 +0800 CST

Problemas ao iniciar a instalação headless do NetBSD no VirtualBox

  • 0

Em uma máquina Ubuntu 22.04 sem cabeça, gostaria de iniciar uma instalação sem cabeça do NetBSD 9.2 no VirtualBox.

Eu tenho uma máquina virtual preparada com um conjunto de imagens de disco em branco anexadas, bem como com o CD de instalação inicializável do NetBSD anexado à unidade de CDROM.

Minha ideia era fazer a instalação pela porta serial, usando minicom, mas não estou conseguindo fazer a instalação mudar para usar o console serial.

Estou iniciando a máquina com

VBoxManage startvm netbsd --type=headless

Então eu tento fazer com que ele mude o console para a porta serial:

VBoxManage controlvm netbsd keyboardputfile boot.conf

... onde boot.confestá um arquivo contendo uma linha de texto dizendo consdev com0, que é o que você digitaria no prompt de inicialização do NetBSD para alternar para o console serial.

Eu sei que o console serial do NetBSD está configurado para usar 9600 8N1, que é o que eu minicomconfigurei para usar, e configurei a porta serial na máquina virtual assim:

UART 1:                      I/O base: 0x03f8, IRQ: 4, attached to pipe (server) '/tmp/netbsd.pipe', 16550A

eu começo a minicomusar

minicom -D 'unix#/tmp/netbsd.pipe'

Eu uso com sucesso o console serial em outra máquina virtual de maneira idêntica e posso ver o status na minicommudança de "Offline" para "Online" assim que a máquina NetBSD liga, mas não há saída no arquivo minicom.

Alguém pode ver qual é o problema e como eu faria para corrigi-lo? Eu sei que a alternativa seria inicializar a máquina por PXE, mas eu esperava poder evitar fazer isso (já que não inicializo mais nada no momento).

virtualbox system-installation
  • 1 respostas
  • 40 Views
Martin Hope
Kusalananda
Asked: 2021-12-11 10:55:05 +0800 CST

Podar a árvore de pesquisa se o arquivo for encontrado

  • 2

Eu preciso pesquisar uma hierarquia de diretórios bastante grande para arquivos regulares com nomes que correspondam a um padrão de globbing de nome de arquivo específico. A hierarquia é tão grande (muito profunda e com alguns diretórios enormes) que levaria muito tempo para adotar uma abordagem ingênua:

find /top/dir -type f -name 'pattern'

(Onde patternestá algum padrão como *proj*.tgz.)

Devido à natureza da estrutura de diretórios, sei que poderia introduzir uma otimização para podar a árvore de pesquisa se findencontrasse um arquivo em um diretório. Por exemplo, encontrar um ou vários arquivos em um diretório específico significaria que eu não precisaria examinar nenhum dos subdiretórios desse diretório específico para outras correspondências.

Como aplicar -prunea um arquivo normal não está fazendo a coisa certa, não posso simplesmente fazer

find /top/dir -type f -name 'pattern' -prune

Descrição: Como evito pesquisar os subdiretórios do diretório que contém o(s) arquivo(s) que corresponde(m) ao padrão?

find
  • 2 respostas
  • 69 Views
Martin Hope
Kusalananda
Asked: 2019-12-23 16:54:39 +0800 CST

ssh-keygen e sua opção -Z no OpenBSD e no RHEL

  • 6

Estou acompanhando um texto bastante bom sobre certificados SSH escritos para RHEL 6 e openssh-5.3p1-94.el6(o que o torna com cerca de 10 anos) enquanto tento imitar os exemplos no meu sistema atual do OpenBSD.

Um dos exemplos mostra a criação de uma chave de CA do host e a assinatura da chave RSA do host:

ssh-keygen -s ~/.ssh/ca_host_key -I host_name -h -Z host_name.example.com -V -1w:+54w5d /etc/ssh/ssh_host_rsa.pub
Enter passphrase:
Signed host key /root/.ssh/ssh_host_rsa-cert.pub: id "host_name" serial 0 for host_name.example.com valid from 2015-05-15T13:52:29 to 2016-06-08T13:52:29

Quando tentei isso no OpenBSD, não obtive a for host_name.example.comsaída. O texto diz que

A -Zopção restringe este certificado a um host específico dentro do domínio.

... e estou um pouco confuso sobre isso, pois o manual do OpenBSDssh-keygen(1) nunca menciona uma -Zopção. Também estou confuso sobre ssh-keygenaceitar essa opção não documentada sem reclamar.

Olhando para o código-fonte parassh-keygen , a -Zopção é aceita, mas parece ter algo a ver com uma "cifra de formato" (ou possivelmente "formato de cifra") em vez de um nome de host (desde que eu esteja olhando para o código correto):

case 'Z':
    openssh_format_cipher = optarg;
    break;

Olhando para versões mais antigas do código, sempre teve algo a ver com "cifra de formato".

As notas de lançamento do OpenSSH não mencionam -Z.

Pergunta: O ssh-keygenRHEL 6 (não tenho certeza se a versão é relevante, mas a documentação equivalente sobre certificados SSH para RHEL 7 ou RHEL 8 parece não estar disponível) corrigido com patches somente RedHat que fazem -Zagir de maneira diferente?

rhel ssh
  • 2 respostas
  • 239 Views
Martin Hope
Kusalananda
Asked: 2019-12-02 07:03:35 +0800 CST

mktemp no macOS não honra $ TMPDIR

  • 9

Eu notei isso antes, mas foi trazido novamente quando eu estava respondendo " Como mover o diretório para um diretório com o mesmo nome? ":

O mktemputilitário no macOS não se comporta da mesma forma que o utilitário de mesmo nome no Linux ou BSD (ou pelo menos no OpenBSD) em relação à TMPDIRvariável de ambiente.

Para criar um arquivo temporário no diretório atual , geralmente posso dizer

tmdfile=$(TMPDIR=. mktemp)

ou

tmpfile=$(TMPDIR=$PWD mktemp)

(e da mesma forma para um diretório temporário com mktemp -d).

No macOS, terei que forçar o utilitário a usar o diretório atual, fornecendo um modelo real, como em

tmpfile=(mktemp ./tmp.XXXXXXXX)

porque usar o mais conveniente tmpfile=$(TMPDIR=. mktemp)ignoraria a TMPDIRvariável e criaria o arquivo em /var/folders/qg/s5jp5ffx2p1fxv0hy2l_p3hm0000gn/Tou em um diretório com nome semelhante.

O manual para mktempno macOS menciona que

Se a -t prefixopção for fornecida, mktempgerará uma string de modelo com base no prefixo e na _CS_DARWIN_USER_TEMP_DIRvariável de configuração, se disponível. Os locais de fallback, se _CS_DARWIN_USER_TEMP_DIRnão estiverem disponíveis, são TMPDIRe /tmp.

No meu sistema, _CS_DARWIN_USER_TEMP_DIRparece não estar definido:

$ getconf _CS_DARWIN_USER_TEMP_DIR
getconf: no such configuration parameter `_CS_DARWIN_USER_TEMP_DIR'

mas por exemplo

tmpfile=$(TMPDIR=. mktemp -t hello)

ainda cria um arquivo em /var/folders/.../(também ao usar $PWDno lugar de .).

estou percebendo isso

$ getconf DARWIN_USER_TEMP_DIR
/var/folders/qg/s5jp5ffx2p1fxv0hy2l_p3hm0000gn/T/

mas isso não me ajuda muito, pois eu não saberia como alterar esse valor.

Diz-se que o utilitário macOS mktempvem do FreeBSD, que por sua vez o obteve do OpenBSD (que deve ter sido há bastante tempo).

Pergunta:

Isso é um bug (ou omissão) na implementação do macOS do mktemp? Como faço para alterar o DARWIN_USER_TEMP_DIRvalor (ou _CS_DARWIN_USER_TEMP_DIRmencionado pelo manual) de dentro de um script (o ideal é desativá-lo para que $TMPDIRtenha precedência)?

environment-variables macos
  • 1 respostas
  • 1827 Views
Martin Hope
Kusalananda
Asked: 2019-11-25 06:54:32 +0800 CST

Usando ntpd para monitorar o desvio de tempo, mas não para ajustar

  • 1

Eu gostaria de usar o ntpddaemon comum para testar se o tempo é mantido por uma máquina virtual ou não, sem deixá-lo realmente ajustar o relógio.

Estou executando o Solaris 11.4 (imagem padrão da Oracle para Intel) dentro do VirtualBox em um sistema macOS e não consigo sincronizar corretamente. Ocorreu-me que a VM pode estar usando o VirtualBox Guest Additions para fazer isso (não sei como isso funciona) e que posso estar atrapalhando o tempo executando ntpdo convidado.

Para testar isso, pensei em configurar ntpdno Solaris VM para monitorar alguns servidores de horário público, mas de alguma forma impedir que ele modificasse o relógio local. Dessa forma, eu poderia ver como os logs loopstatse os peerstatsregistros pareciam ao longo do tempo para ver se o relógio local realmente mantinha um bom tempo.

O problema é que não consigo encontrar nenhuma dica sobre como parar ntpdde ajustar o relógio local.

Eu queria fazer isso no passado também em sistemas onde eu uso openntpd(do OpenBSD) para manter o tempo real. O ntpddaemon poderia então ficar em segundo plano e monitorar, sem interferir. Mas também não consegui encontrar nenhuma maneira de conseguir isso.

configuration virtualbox
  • 2 respostas
  • 1508 Views
Martin Hope
Kusalananda
Asked: 2019-11-14 23:34:45 +0800 CST

Limitando o escopo dos qualificadores glob no zsh

  • 4

Tenho quase certeza de que isso não é algo que o zshshell fornece uma maneira de fazer, mas pensei em perguntar de qualquer maneira apenas para ter certeza de que não estou perdendo nada do manual.

Com o zshshell, posso escolher os dois maiores arquivos visíveis de um diretório com o padrão

*(.OL[1,2])

Se eu tiver um conjunto de diretórios e quiser ter os dois maiores arquivos de cada um, acredito que teria que percorrer os diretórios individuais e depois usar

$dirpath/*(.OL[1,2])

(onde $dirpathé o caminho do diretório na iteração atual do loop).

Seria bom poder dizer

*/*(.OL[1,2])

mas esse qualificador glob se aplicaria à lista de nomes correspondentes como um todo, e eu obteria duas correspondências, não duas de cada diretório.

Descrição: Seria possível limitar o "escopo" do qualificador para afetar apenas o componente de caminho mais recente de alguma forma?

zsh
  • 2 respostas
  • 613 Views
Martin Hope
Kusalananda
Asked: 2019-11-09 07:51:50 +0800 CST

Retornando itens aleatórios da partida global

  • 5

Com os qualificadores de glob em zshum pode classificar os resultados de uma correspondência de padrão de globbing de nome de arquivo de várias maneiras. Por exemplo, o padrão *(om)corresponderia a todos os nomes não ocultos no diretório atual, ordenados por carimbo de data/hora de modificação.

No entanto, às vezes eu queria ter uma maneira de ter uma ordenação aleatória (por exemplo, para obter uma amostragem aleatória de arquivos). Até onde eu vi, não há qualificador que faça isso diretamente.

Descrição: Como posso obter de volta uma lista aleatória de nomes de caminho de um zshpadrão de globbing de nome de arquivo?

zsh
  • 1 respostas
  • 508 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
Kusalananda
Asked: 2019-03-18 14:48:05 +0800 CST

Invertendo um array associativo

  • 10

Digamos que eu tenha um array associativo em bash,

declare -A hash
hash=(
    ["foo"]=aa
    ["bar"]=bb
    ["baz"]=aa
    ["quux"]=bb
    ["wibble"]=cc
    ["wobble"]=aa
)

onde tanto as chaves quanto os valores são desconhecidos para mim (os dados reais são lidos de fontes externas).

Como posso criar um array de chaves correspondentes ao mesmo valor, para que eu possa, em um loop sobre todos os valores únicos, fazer

printf 'Value "%s" is present with the following keys: %s\n' "$value" "${keys[*]}"

e obtenha a saída (não necessariamente nesta ordem)

Value "aa" is present with the following keys: foo baz wobble
Value "bb" is present with the following keys: bar quux
Value "cc" is present with the following keys: wibble

A parte importante é que as chaves são armazenadas como elementos separados na keysmatriz e, portanto, não precisam ser analisadas de uma string de texto.

eu poderia fazer algo como

declare -A seen
seen=()
for value in "${hash[@]}"; do
    if [ -n "${seen[$value]}" ]; then
        continue
    fi

    keys=()
    for key in "${!hash[@]}"; do
        if [ "${hash[$key]}" = "$value" ]; then
            keys+=( "$key" )
        fi
    done

    printf 'Value "%s" is present with the following keys: %s\n' \
        "$value" "${keys[*]}"

    seen[$value]=1
done

Mas parece um pouco ineficiente com esse loop duplo.

Existe um pedaço de sintaxe de matriz que eu perdi bash?

Fazer isso, por exemplo, zshme daria acesso a ferramentas de manipulação de matriz mais poderosas?

Em Perl, eu faria

my %hash = (
    'foo'    => 'aa',
    'bar'    => 'bb',
    'baz'    => 'aa',
    'quux'   => 'bb',
    'wibble' => 'cc',
    'wobble' => 'aa'
);

my %keys;
while ( my ( $key, $value ) = each(%hash) ) {
    push( @{ $keys{$value} }, $key );
}

foreach my $value ( keys(%keys) ) {
    printf( "Value \"%s\" is present with the following keys: %s\n",
        $value, join( " ", @{ $keys{$value} } ) );
}

Mas basharrays associativos não podem conter arrays...

Eu também estaria interessado em qualquer solução da velha escola possivelmente usando alguma forma de indexação indireta (construindo um conjunto de matriz(es) de índice ao ler os valores que eu disse que tinha hashacima?). Parece que deveria haver uma maneira de fazer isso em tempo linear.

bash scripting
  • 4 respostas
  • 1408 Views
Martin Hope
Kusalananda
Asked: 2019-02-26 00:57:05 +0800 CST

OpenBSD: Verifique quais arquivos em /etc foram alterados em comparação com o sistema base original

  • 1

Estou planejando configurar um novo sistema pessoal atual do OpenBSD por meio da instalação do último snapshot do OpenBSD , e gostaria que ele se parecesse mais ou menos com o meu sistema atual do OpenBSD existente em termos de alterações locais feitas nos arquivos under /etcsem realmente copiar o /etcdiretório para o novo sistema (ele também contém a configuração que o novo sistema não deve usar e outras coisas que devem ser diferentes).

Qual é a maneira mais fácil de comparar minha configuração antiga com a de um sistema original para que eu possa passar manualmente e configurar a nova máquina? Eu gostaria de compilar uma lista de serviços de sistema base individuais etc. que eu preciso configurar após instalar o novo sistema OpenBSD, apenas como uma forma de não deixar coisas de fora acidentalmente, como configurar um alias de email para root.

configuration openbsd
  • 1 respostas
  • 392 Views
Martin Hope
Kusalananda
Asked: 2019-01-24 08:38:50 +0800 CST

Um pouco confuso sobre se printf no shell yash é um comando interno ou não

  • 15

O yashshell possui um printfbuilt-in, de acordo com seu manual .

No entanto, é isso que vejo em um yashshell com configuração padrão:

$ command -v printf
/usr/bin/printf
$ type printf
printf: a regular built-in at /usr/bin/printf

É printfum built-in neste shell ou não? O resultado é semelhante para vários outros utilitários supostamente integrados que também estão disponíveis como comandos externos.

Como comparação, em pdksh( kshno OpenBSD, onde nãoprintf é um built-in):

$ command -v printf
/usr/bin/printf
$ type printf
printf is /usr/bin/printf

E em bash(onde printf está um built-in):

$ command -v printf
printf
$ type printf
printf is a shell builtin
posix printf
  • 2 respostas
  • 1225 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