No "one-liner" a seguir, quando altero o ID
valor da variável no início do script, a disk
variável a seguir parece não ser atualizada. Ou seja, no final do script, a >> /md0/DiskAnalysis/$disk.txt
parte usa o valor da $disk
variável que foi gerada por um $ID
valor de variável diferente daquele definido no início do script.
Script completo de uma linha
nohup sh -c ID="c"; disk=`udevadm info --query=all /dev/sd$ID | grep ID_SCSI_SERIAL | awk -F'=' '{print $2}'`; size=`lsblk -b --output SIZE -n -d /dev/sd$ID`; size=`echo "$size / 1024 / 1024 / 10" | bc`; for i in $(seq 0 $size); do dd if=/dev/sd$ID of=/dev/shm/$ID.dd bs=10M skip=$i count=1 2>1; sha256=`sha256sum /dev/shm/$ID.dd | awk -F' ' '{print $1}'`; md5=`md5sum /dev/shm/$ID.dd | awk -F' ' '{print $1}'`; echo "$i,$sha256,$md5" >> /md0/DiskAnalysis/$disk.txt; done &
Então, quando eu mudo ID="b"
para ID="c"
, o
disk=`udevadm info --query=all /dev/sd$ID | grep ID_SCSI_SERIAL | awk -F'=' '{print $2}'`
parte do script não atualiza seu valor para refletir a alteração no $ID
valor da variável. No entanto, se eu fosse executar o seguinte sozinho no terminal:
ID="b"; disk=`udevadm info --query=all /dev/sd$ID | grep ID_SCSI_SERIAL | awk -F'=' '{print $2}'`; echo $disk
e
ID="c"; disk=`udevadm info --query=all /dev/sd$ID | grep ID_SCSI_SERIAL | awk -F'=' '{print $2}'`; echo $disk
Eu recebo dois valores diferentes para $disk
.
O que estou perdendo que está resultando na $disk
atualização do valor da variável no script completo?
No momento, estou assumindo que a alteração no $ID
valor em outras partes do script (ou seja, as somas de verificação) está funcionando corretamente. No entanto, como o $disk
valor não está sendo atualizado corretamente, a saída não está gravando no arquivo desejado. Na verdade, toda vez que executo o script com um $ID
valor diferente do original ( ID="b"
), a saída do restante do script é gravada no arquivo de saída (ou seja, $disk
) definido pelo primeiro original $ID
.
Obrigado.
Há um sem aspas, sem escape
;
lá.nohup sh -c ID="c"; whatever
executanohup sh -c ID="c"
primeiro, depoiswhatever
.O primeiro comando é quase um no-op. Não afeta as variáveis do shell atual, não afeta as expansões quando
whatever
é interpretado no shell atual, não afetawhatever
da maneira que você deseja. Ele apenas crianohup.out
(se ainda não foi criado).Basicamente você precisa
nohup sh -c 'ID="c"; whatever'
(adicione&
se necessário). Aqui;
não é interpretado pelo shell atual. Toda a string entre aspas simples acabará se tornando um argumento de opção passado parash -c
.Eu não analisei seu comando específico completamente o suficiente para dizer:
sh -c
contiver aspas apropriadas no contexto desh
.Em geral, são questões diferentes.
No seu 'script' como está escrito, o
sh -c
aplica-se apenas aID="c"
, ou seja, não a tudo à direita do ponto-e-vírgula. Isso significaID="c"
que é definido em um processo filho que é limpo antes de executar o próximo comando. Para ver isso, basta fazersh -c somevar="x"; echo $somevar
.Para que a variável seja compartilhada, ela precisa ser exportada (consulte Diferença entre "a=b" e "exportar a=b" em bash ) ou ter o mesmo processo pai.
Por exemplo,
somevar="x"; echo $somevar
(sem definir a variável em um processo filho) funcionaria; oush -c 'somevar="x"; echo $somevar'
também funcionaria, já que os dois comandos são filhos desh -c
.