Tenho um programa de captura de câmera e um programa de streaming de vídeo trabalhando juntos como rpicam-vid ... | go2rtc
. Meu problema é que ele go2rtc
só lê dados do pipe quando alguém abre o stream de vídeo, mas preciso rpicam-vid
executar continuamente mesmo quando o stream não está ativo. Existe uma maneira de simplesmente descartar dados quando o leitor não está puxando dados?
Para usar um comando com o echo
operador de redirecionamento "into a file" >>
através sudo
do comando ..., escrevi que redirecionar através da entrada padrão para o sudo
processo, executado como superusuário. O comando para redirecionar era echo "tun" >> /etc/modules-load.d/tun.conf
, aqui eu coloquei whoami
em seu lugar.
tentei
echo 'whoami' | sudo -i '$SHELL -c "exec $(< /dev/stdin)"'
e a seguir,
echo 'whoami' | sudo -i '$SHELL -c "$(< /dev/stdin)"'
e sh
respondeu -sh: /bin/sh -c "$(< /dev/stdin)": not found
.
Para que serve isso? Por que a distribuição Alpine Linux sh
não encontra meus comandos executados por meio de sudo
?
sudo -V
(número da versão e versões compiladas):
Sudo version 1.9.15p5
Sudoers policy plugin version 1.9.15p5
Sudoers file grammar version 50
Sudoers I/O plugin version 1.9.15p5
Sudoers audit plugin version 1.9.15p5
Obrigado por qualquer resposta! 🙂
Minha pergunta mostrará que não consigo descobrir a distância real entre um sistema operacional Android e uma distribuição Linux .
Quando eu tento a maioria das distros que têm uma interface de usuário, da mais antiga à mais recente, da mais simples à mais especializada, todas oferecem um shell. sh
, bash
, etc. Se eu tentar uma na distrosea ou em outro site do tipo, tenho certeza de que terei pelo menos esse recurso, para testar meu comando ls
ou pwd
...
Mas não há nada parecido no meu telefone Android
.
Não é o propósito de um smartphone oferecer uma abertura de terminal em um prompt de shell, isso é verdade. Mas, pelos anos que eles existem, acho que alguns usuários teriam pensado nisso.
Mas nunca vi um terminal num smartphone... Se nenhum lugar em lugar nenhum me oferece a possibilidade de instalar um, é porque certamente é impossível.
E eu me pergunto: se para milhares de distros que têm uma UI um aplicativo de terminal abrindo para um shell está disponível, por que tal terminal não pode existir em um Sistema Operacional Android, se for do tipo Linux ? O que está impedindo isso?
Epílogo: Perdi pontos de reputação, mas ganhei um conhecimento útil. Eu tinha certeza, não tendo pesquisado eficientemente, que não havia maneira de acessar um shell em um telefone Android.
E aprendi o contrário. Estou feliz. Obrigado!
Estou trabalhando em um sistema arm64 ( Arm PL011 ) e portei o linux 5.15.68 usando u-boot-spl , busybox. No passado, eu podia usar Ctrl-C no shell do linux digitando
setsid cttyhack sh
Mas de alguma forma não funciona agora. E também recebo um erro:
can't open /dev/ttyAMA0
Houve algumas mudanças, mas não sei o que causou essa mudança.
Estou tentando escrever um shell estritamente compatível com POSIX, mas o padrão não deixa claro como ir de bytes para caracteres. Ele diz para usar LC_CTYPE
, que vincula ainda mais ao conceito de um arquivo charmap , mas em nenhum lugar é declarado onde esses arquivos charmap estão localizados e como lê-los. man 5 charmap
diz que eles geralmente estão localizados em /usr/share/i18n/charmaps
, mas isso não é o suficiente para mim. Além disso, no meu sistema Linux, os arquivos naquele diretório são codificados em gzip, o que eu acho que pode não ser compatível, mas não encontrei nada sobre isso em lugar nenhum.
Estou pensando que deve haver alguns utilitários C padrão para obter os detalhes da codificação de caracteres atual (senão como alguém poderia usá-la?), mas não consegui encontrar nada do tipo na minha pesquisa na web. Existem as funções setlocale
and nl_langinfo
, a última das quais pode dar a você o nome da codificação de caracteres usada atualmente, mas isso não me ajuda a decodificá-la.
Ou eu deveria saber e implementar todas elas com antecedência?
Como posso adicionar args ao comando que uso como $EDITOR
shell fish? Especificamente usando a export EDITOR=...
sintaxe em vez do set
comando.
Quero fazer algo assim export EDITOR='code --wait'
, mas isso não funciona:
> $EDITOR
code --wait: command not found
somefile
contém isto:
aaa
bbb
ccc
Este é o subshell que pode sair antes de concluir todas as iterações. No meu caso particular é, while
mas poderia ser for
ou until
:
cat "somefile" | while read -r line
do
echo "$line"
if [ "$line" = "bbb" ]
then
exit 2
fi
done
exit_code="$?"
if [ "$exit_code" -ne 0 ]
then
exit
fi
echo "I'm here"
O problema é que a última linha I'm here
é impressa. Minha intenção é sair completamente para o terminal. No entanto, não tenho certeza se isso está correto e funcionará com todos os shells. Isso é mesmo POSIX? Alguma menção sobre como isso deve funcionar no POSIX?
Perguntei a vários mecanismos de IA e cada um deles vem com uma resposta diferente:
- Copiloto: diz que o exit_code será sempre 0, pois esse é o código de saída do cat. Poderia ser qualquer outro comando.
- ChatGPT: diz que o exit_code será o número após a saída, como aqui 2, porque se propaga.
- Gêmeos: diz que o exit_code será sempre 0, porque $? obtém o código de saída da última instrução, que é
done
e é sempre 0.
Alguma ajuda aqui? Eu tentei no bash e ele detecta o código de saída, mas não tenho certeza se é alguma configuração específica do bash (como pipefail ou é a maneira como funciona com qualquer shell (por exemplo, no UNIX também).
zsh=/bin/zsh
sh -c "echo $zsh >> /etc/shells"
sh: /etc/shells: Permission denied
OK, tudo bem. E se eu adicionar sudo
, funciona. Multar.
zsh=/bin/zsh
sudo sh -c "echo $zsh >> /etc/shells"
Mas se eu usar open
(para adicionar /bin/zsh
manualmente /etc/shells
), mesmo que eu já use sudo
, tentar editar o arquivo abre uma janela de diálogo que diz que não posso editá-lo:
sudo sh -c 'open /etc/shells'
Você não possui o arquivo “shells” e não tem permissão para escrever nele.
Você pode duplicar este documento e editar a duplicata. Somente a duplicata incluirá suas alterações.
Por que é que? O que há de errado com o sudo sh -c 'open /etc/shells'
comando?
O padrão shell POSIX oferece três exceções à aplicação de set -e
:
- A falha de qualquer comando individual em um pipeline multicomando não deve causar a saída do shell. Somente a falha do próprio gasoduto será considerada.
- A configuração -e deve ser ignorada ao executar a lista composta após a palavra reservada while, Until, if ou elif, um pipeline começando com ! palavra reservada ou qualquer comando de uma lista AND-OR diferente do último.
- Se o status de saída de um comando composto diferente de um comando subshell foi o resultado de uma falha enquanto -e estava sendo ignorado, então -e não se aplicará a este comando.
Estou lutando para entender o significado de (3); está se referindo a algo como:
set -e
{ false; } && :
( false ) && :
Aqui { false; }
está um comando composto não subshell com status de saída 1. O status de saída resultou da "falha" de falso. set -e
está sendo ignorado durante a execução false
porque não é o último comando de uma lista AND-OR. O mesmo se aplica a ( false )
, mas é um comando subshell, então é set -e
permitido aplicá-lo no shell pai e assim sair?
Este não parece ser o caso em shells reais, então tenho certeza de que este exemplo não é o que (3) está falando. Afinal, isso significaria coisas como if ( false ); then :; fi
poderia sair ao executar a condição if. Mas, parece que os únicos contextos em que set -e
está sendo ignorado são definidos por (2), então quando (3) poderia ser aplicado de forma lógica?
Essencialmente, qual é um exemplo que demonstra claramente o significado de (3), tanto a que se aplica como por que faz uma distinção para subcamadas?
Neste comando, se curl for bem-sucedido, então res será igual à saída de curl. Parece que '=' tem precedência maior que '||'.
res=$(curl -s "http://example.com")||true
Mas '||' deve ter precedência maior que '=' de acordo com este link: https://tldp.org/LDP/abs/html/opprecedence.html