
Ich schreibe ein Skript, um einen fehlenden Buchstaben „F“ in einer Mail-Logdatei zu korrigieren. Die Mail-Logdatei wird ständig aktualisiert. Ich erhalte einen Dateinamen und führe anschließend „sudo su“ aus, um Superuser-Zugriff zu erhalten. Innerhalb von sudo behebe ich das fehlende „F“. Ich kann diesen Dateinamen jedoch nicht innerhalb des Sudo-Blocks verwenden. Kann mir bitte jemand helfen, wie ich diese Shell-Variablen innerhalb von sudo exportieren kann? Ich habe versucht, „export“ zu verwenden, aber es funktioniert nicht. Der Codeblock, den ich erstellt habe, ist wie folgt:
#Script to solve F issue
#----------------------------------------
#By Kapil Shirsath
#----------------------------------------
cd /var/spool/mail #mail files reside in mail folder
echo "Entered in mail folder"
filename=`ls -lrt 99999*| sort -k 5 -rn | head -1 | tr -s " " "," | cut -d "," -f "8"` # this will list the file with maximum size`
echo "File with maximum size is $filename"
echo "----------------------------------------------------"
echo "Is it the file expected?(y/n)"
read choice
if test $choice == "n"
then
echo "Exiting...."
exit;
fi;
c=1
while [ $c -le 5 ]
do
ls -lrt $filename
echo $filename
sleep 3
c=`expr $c + 1`
done
echo "---------------------------------------------------"
sudo su<<'HERE' #this will give you super user permissions
echo "Got root access"
echo "First line of the file is as below :"
head -1 $filename
echo "---------------------------------------"
firstline=`head -1 $filename`
echo "Repeat : $firstline"
echo $firstline | grep ^"rom" >/dev/null
if test $? -eq 0
then
ex -s $filename <<'EOF'
1s/^/F/
:wq
EOF
echo "F issue fixed!"
HERE
c=1
while [ $c -le 5 ]
do
ls -lrt $filename
sleep 3
c=`expr $c + 1`
done
echo "---------------------------------------------------"
else
echo "Not finding the missing 'F' ! !! Kindly check with your system "
exit;
fi;
Antwort1
Sie haben das Heredoc-Trennzeichen zitiert:
sudo su<<'HERE'
Variablen in einem Heredoc werden nicht erweitert, wenn das Trennzeichen in Anführungszeichen steht.Aus den Dokumenten:
Wenn irgendwelche Zeichen inWortzitiert werden, dieTrennzeichenist das Ergebnis der Zitatentfernung aufWort, und die Zeilen im Here-Dokument werden nicht erweitert. WennWortist nicht in Anführungszeichen gesetzt, alle Zeilen des Here-Dokuments unterliegen der Parametererweiterung, Befehlsersetzung und arithmetischen Erweiterung, die Zeichenfolge
\newline
wird ignoriert und die Zeichen ' ', ' ' und ' '\
müssen mit ' ' in Anführungszeichen gesetzt werden .\
$
`
Benutz einfach:
sudo su <<HERE
Beispiel:
$ a=1; cat <<HERE
> $a
> HERE
1
$ a=1; cat <<'HERE'
> $a
> HERE
$a