Estou migrando alguns softwares do Unix para o Linux.
Eu tenho o seguinte script; é um gatilho de uma transferência de arquivo.
O que os exec
comandos fazem?
Eles funcionarão também no Linux?
#!/bin/bash
flog=/mypath/log/mylog_$8.log
pid=$$
flog_otherlog=/mypath/log/started_script_${8}_${pid}.log
exec 6>&1
exec 7>&2
exec >> $flog
exec 2>&1
exec 1>&6
exec 2>&7
/usr/local/bin/sudo su - auser -c "/mypath/bin/started_script.sh $1 $pid $flog_otherlog $8"
O script iniciado é o seguinte:
#!/bin/bash
flusso=$1
pidpadre=$2
flogcurr=$3
corrid=$4
pid=$$
exec >> $flogcurr
exec 2>&1
if [ $1 = pippo ] || [ $1 = pluto ] || [ $1 = paperino ]
then
fullfile=${myetlittin}/$flusso
filename="${flusso%.*}"
datafile=$(ls -le $fullfile | awk '{print $6, " ", $7, " ", $9, " ", $8 }')
dimfile=$(ls -le $fullfile | awk '{print $5 " " }')
aaaammgg=$(ls -E $fullfile | awk '{print $6}'| sed 's#-##g')
aaaamm=$(echo $aaaammgg | cut -c1-6)
dest_dir=${myetlwarehouse}/mypath/${aaaamm}
dest_name=${dest_dir}/${filename}_${aaaammgg}.CSV
mkdir -p $dest_dir
cp $fullfile $dest_name
rc_copia=$?
fi
Vou mudar ls -le
para ls -l --time-style="+%b %d %T %Y"
e ls -E
em ls -l --time-style=full-isoand
Linux.
exec [n]<&word
irá duplicar um descritor de arquivo de entrada no bash.exec [n]>&word
irá duplicar um descritor de arquivo de saída no bash.Veja 3.6.8 em: https://www.gnu.org/software/bash/manual/html_node/Redirections.html
A ordem dos argumentos pode ser confusa, no entanto.
No seu roteiro:
exec 6>&1
cria uma cópia do descritor de arquivo1
, ou seja, STDOUT, e a armazena como descritor de arquivo6
.exec 1>&6
cópias6
de volta para1
.Também poderia ter sido movido acrescentando um traço, ou seja,
1<&6-
fechando o descritor6
e deixando apenas1
.No meio, você normalmente encontrará operações que gravam em STDOUT e STDIN, por exemplo, em um subshell.
Veja também: Uso prático para mover descritores de arquivos
exec {number x}>&{number y}
copia o descritor de arquivo X em Y.Uso de descritores de arquivo:
No seu caso, eles deveriam ter sido abertos em algum lugar anteriormente com algo como
exec 3<> /tmp/some_file
definir fd3 para algum arquivo.Normalmente, você pode executar exec
2>&1
para redirecionar a saída do stderr para o stdout.Seu exemplo bash não está completo, pois
$8
se refere aos oito argumentos fornecidos ao seu script, então definitivamente há algo que está faltando aqui, como os argumentos 2-7 ...