Estou um pouco confuso sobre a opção -e ausente do manual do bash.man bash
Mas está trabalhando com um script shebang como: #!/bin/bash -e
e é claro que é definido em help set
.
Por que não está listado nas opções do manual do bash?
Eu sempre pensei que PS1
era uma variável de ambiente. Mas quando eu verifico o padrão .bashrc
do Ubuntu e verifico PS1
com
grep PS1 /etc/skel/.bashrc
não há export PS1
.
Se não houver exportação, isso significa que não é uma variável de ambiente?
Às vezes, tenho um erro ext4 e meu disco se torna somente leitura.
Eu posso corrigi-lo com uma reinicialização e fcsk /dev/sda2
, mas ele continua voltando ...
Aqui estão alguns dmesg
:
[ 3160.692730] perf: interrupt took too long (2509 > 2500), lowering kernel.perf_event_max_sample_rate to 79500
[ 3631.408303] perf: interrupt took too long (3144 > 3136), lowering kernel.perf_event_max_sample_rate to 63500
[ 4143.729000] perf: interrupt took too long (3992 > 3930), lowering kernel.perf_event_max_sample_rate to 50000
[ 4770.574303] perf: interrupt took too long (5018 > 4990), lowering kernel.perf_event_max_sample_rate to 39750
[ 5334.077445] perf: interrupt took too long (6289 > 6272), lowering kernel.perf_event_max_sample_rate to 31750
[ 8241.921553] acer_wmi: Unknown function number - 8 - 1
[11370.110956] perf: interrupt took too long (7918 > 7861), lowering kernel.perf_event_max_sample_rate to 25250
[11484.098212] acer_wmi: Unknown function number - 8 - 0
[11875.568601] EXT4-fs error (device sda2): ext4_iget:4862: inode #92441: comm TaskSchedulerFo: bad extra_isize 9489 (inode size 256)
[11875.575273] Aborting journal on device sda2-8.
[11875.575537] EXT4-fs error (device sda2) in ext4_da_write_end:3209: IO failure
[11875.575976] EXT4-fs (sda2): Remounting filesystem read-only
[11875.576792] EXT4-fs error (device sda2): ext4_journal_check_start:61: Detected aborted journal
[11875.577612] EXT4-fs error (device sda2): ext4_iget:4862: inode #92441: comm TaskSchedulerFo: bad extra_isize 9489 (inode size 256)
[11875.583499] EXT4-fs error (device sda2): ext4_iget:4862: inode #92441: comm TaskSchedulerFo: bad extra_isize 9489 (inode size 256)
[11875.832886] EXT4-fs error (device sda2): ext4_iget:4862: inode #92441: comm TaskSchedulerFo: bad extra_isize 9489 (inode size 256)
[11899.686408] systemd-journald[395]: Failed to write entry (21 items, 614 bytes), ignoring: Read-only file system
[11899.686483] systemd-journald[395]: Failed to write entry (21 items, 705 bytes), ignoring: Read-only file system
[11899.686587] systemd-journald[395]: Failed to write entry (21 items, 614 bytes), ignoring: Read-only file system
[11899.686656] systemd-journald[395]: Failed to write entry (21 items, 705 bytes), ignoring: Read-only file system
[11899.686719] systemd-journald[395]: Failed to write entry (21 items, 614 bytes), ignoring: Read-only file system
[11899.686781] systemd-journald[395]: Failed to write entry (21 items, 705 bytes), ignoring: Read-only file system
[11899.686844] systemd-journald[395]: Failed to write entry (21 items, 614 bytes), ignoring: Read-only file system
[11899.686938] systemd-journald[395]: Failed to write entry (21 items, 705 bytes), ignoring: Read-only file system
[11899.686999] systemd-journald[395]: Failed to write entry (21 items, 614 bytes), ignoring: Read-only file system
[11899.687084] systemd-journald[395]: Failed to write entry (21 items, 705 bytes), ignoring: Read-only file system
E meu /etc/fstab
:
UUID=9c882ba5-b980-4f7d-dd02-cd0a1831ab1a / ext4 errors=remount-ro 0 1
UUID=0E37-D0A2 /boot/efi vfat umask=0077 0 1
/swapfile none swap sw 0 0
Devo remover ou alterar remount-ro
e fstab
ignorar este erro? Como corrigir/evitar este erro?
Eu uso o seguinte código para excluir uma linha:
sed -i "0,/$DELETE_THIS/{/$DELETE_THIS/d;}" file.txt
Mas esse código falha se a variável DELETE_THIS
contiver caracteres especiais, como , .
e assim por diante.../
*
Existe uma maneira de sed
ignorar todos os caracteres especiais e usá-los como texto básico?
É possível enviar uma resposta para um "menu interativo" em um script de shell, mas diretamente ao chamá-lo?
Por exemplo, o roteiro test.sh
:
#!/bin/bash
sleep 2 #Or something else
echo "menu, select 1 for...."
read choice
if [ $choice -eq 1 ]; then
echo AMAZING
fi
Como posso chamar o script test.sh
e enviá-lo automaticamente 1
como minha escolha para o próximo read
, sem alterar o código do script.
O código simples aqui está funcionando conforme o esperado na minha máquina se iniciado com bash
:
function ⏰(){
date
}
⏰
Poderia haver um problema para outras pessoas usando isso, ou é universal?
Eu estou querendo saber porque eu nunca vi nada parecido com isso em outro código-fonte por enquanto.
Editar : Existem possibilidades ilimitadas, ele pode ser usado para distinguir rapidamente uma função de função com o uso de um emoji, por exemplo.
Um ? para algo que pode modificar ou remover arquivos, um ? se for um trabalho em andamento, ? para um menu interativo...
Acho que deveríamos criar um padrão para tudo isso, mas parece ser uma ideia interessante.
Talvez uma linha aleatória de ~5 caracteres possa nos ajudar muito a entender o que o código está fazendo. (É claro que precisamos aprender a lê-los.)
Mais edit: vou tentar. Por enquanto, se eu dobrar todas as minhas funções no meu editor (ou cat myscript.sh|grep function
), elas ficarão assim. (Meu unicode parece muito melhor no geany
meu terminal em comparação com aqui.)
function ⬚_1(){
function ⬚⬚_2(){
function ⬚⬚⬚_?_D(){
function ⬚⬚⬚⬚_?_X(){
function ⬚⬚⬚⬚⬚_?_Y(){
function ⬚⬚⬚⬚⬚⬚_❓_P(){
function ⬚⬚⬚⬚_?_Z(){
function ⬚⬚⬚⬚⬚_❓_U(){
function ⬚⬚⬚⬚⬚_❓_O(){
Eu uso um recuo estranho ⬚ para mostrar como as funções estão relacionadas entre si e um símbolo ?/❓ para distinguir claramente o seu papel. (Claro que esses não são meus nomes de funções reais, apenas coloquei uma letra aleatória no final, mas mesmo sem eles podemos ver claramente os relacionamentos.)
Abrindo um novo terminal e digitando o comando firefox&
dentro, ps -l
dá:
4 R 1000 23132 23104 99 80 0 - 2177945 - pts/27 00:00:07 firefox
Se o shell for fechado com o comando exit
, o processo filho do firefox permanecerá aberto!
Sempre foi assim? O Firefox não deveria estar fechando também? Existe algo novo em um kernel recente ou algo que estou perdendo?
O resultado de ps -el|grep firefox
é então:
4 S 1000 23132 1 14 80 0 - 2233312 poll_s ? 00:00:21 firefox
O PPID foi alterado para 1.
O que é responsável por esta mudança de PPID para 1?
EDIT: Ah, acabei de perceber que fechar o terminal e fechar o shell tem resultados muito diferentes: fechar o terminal fecha todos os processos filhos, mas não quando o shell é fechado com o comando exit... Não faço ideia do porquê. (Fechar o terminal está enviando SIGTERM para todos os processos filhos? Mas fechar o shell está deixando órfãos?)
Eu ficaria neste loop enquanto $CHOICE não for "QUIT" ou um número menor que um determinado inteiro (variável).
Estou usando isso: (22 como exemplo)
NUMBER=22
CHOICE=99
while [ "$CHOICE" -gt "$NUMBER" ] && [ "$CHOICE" != "QUIT" ]; do
read CHOICE < /dev/tty
done
Mas se eu colocar digamos "teste", o script trava porque está esperando um inteiro no primeiro teste.
O que posso fazer para evitar esse crash?
Eu tentei ter um programa interativo em um script bash:
my_program
E desejo poder fechá-lo com 'Ctrl + c'. Mas quando eu faço isso meu script está fechando também.
Eu sei sobre.
trap '' 2
my_program
trap 2
Mas neste caso, não consigo fechar my_program
com Ctrl + c.
Você tem alguma idéia de como permitir Ctrl + c em um programa, mas não fechando o script que o executa?
EDITAR: adicionar exemplo
#!/bin/bash
my_program
my_program2
Se eu usar Ctrl + c para fechar my_program
, my_program2
nunca é executado porque todo o script é encerrado.
Não consigo encontrar nada claro de como o linux está lidando com o teclado. (configurações baseadas no sistema não gui)
Meu problema é : instalei ibus
em um linux mint
com vários idiomas mas simplesmente não funciona, apesar ibus-setup
de , ibus-daemon -rx
...
Talvez meu sistema esteja usando outro método de entrada diferente de ibus
? Existe um comando para saber qual método de entrada meu computador está realmente usando?