Yanıtlar:
Kullanın mktemp -d
. Rastgele bir adla geçici bir dizin oluşturur ve dosyanın zaten mevcut olmadığından emin olur. Yine de dizini kullandıktan sonra silmeyi unutmamalısınız.
Daha sağlam bir çözüm için aşağıdakine benzer bir şey kullanırım. Bu şekilde, komut dosyası çıktıktan sonra geçici dizin her zaman silinir.
Temizleme fonksiyonu EXIT
sinyal üzerinde yürütülür . Bu, komut dosyası bir yerde iptal etse bile temizleme işlevinin her zaman çağrılmasını garanti eder.
#!/bin/bash
# the directory of the script
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# the temp directory used, within $DIR
# omit the -p parameter to create a temporal directory in the default location
WORK_DIR=`mktemp -d -p "$DIR"`
# check if tmp dir was created
if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then
echo "Could not create temp dir"
exit 1
fi
# deletes the temp directory
function cleanup {
rm -rf "$WORK_DIR"
echo "Deleted temp working directory $WORK_DIR"
}
# register the cleanup function to be called on the EXIT signal
trap cleanup EXIT
# implementation of script starts here
...
Bash betiği dizini buradan .
Bash tuzakları .
cleanup
olacak Geçerli dizinden rf rm!
mktemp
başarısız WORK_DIR
boş olacak, komutu anlamı sadece olurdu rm -rf
hiçbir argüman ile. FreeBSD kullanmıyorum ama rm -rf
eşdeğer olsaydı oldukça rm -rf .
TMPWORKDIR=$(basename 'mktemp -d -p /tmp/git/')
ve ardından 2. rmdir /tmp/git/"${TMPWORKDIR}"
. Değişken şimdi boşsa, yine /tmp/git/
de tüm sisteme geri dönmeyeceksiniz . Cevapta böyle bir şey düşünün ve memnuniyetle kabul ediyorum. ;)
Bunun için en sevdiğim tek astar
cd $(mktemp -d)
rm $(pwd)
? : P
pushd $(mktemp -d)
...popd
rm -r $(pwd)
rm -r $(pwd)
. Geçici dizin oluşturma işleminin herhangi bir nedenle başarısız olma olasılığını göz önünde bulundurun (/ tmp dosya sistemi dolu olabilir veya yalnızca bir hata nedeniyle yeniden okunmuş olabilir?); daha sonra kullanıcının giriş dizininde yapılan ve daha sonra silinecek olan değişiklikleri cd $(mktemp -d)
değerlendirir cd
.
if pushd $(mktemp -d || echo BADMPDIR); then ........ ; rm -r $(pwd); popd; fi
Aşağıdaki kod parçası güvenli bir şekilde geçici bir dizin ( -d
) oluşturur ve adını TMPDIR
. ( TMPDIR
Değişken kullanımına ilişkin bir örnek , daha sonra muhtemelen değiştirilecek orijinal dosyaları depolamak için kullanıldığı kodda gösterilir.)
İlk trap
satır exit 1
, belirtilen sinyallerden herhangi biri alındığında komutu yürütür . İkinci trap
satır $TMPDIR
, programın çıkışını (normal ve anormal) kaldırır (temizler ). mkdir -d
Çıkış tuzağının $TMPDIR
bilinmeyen bir durumda yanlışlıkla çalıştırılmasını önlemeyi başardıktan sonra bu tuzakları başlatıyoruz .
#!/bin/bash
# Create a temporary directory and store its name in a variable ...
TMPDIR=$(mktemp -d)
# Bail out if the temp directory wasn't created successfully.
if [ ! -e $TMPDIR ]; then
>&2 echo "Failed to create temp directory"
exit 1
fi
# Make sure it gets removed even if the script exits abnormally.
trap "exit 1" HUP INT PIPE QUIT TERM
trap 'rm -rf "$TMPDIR"' EXIT
# Example use of TMPDIR:
for f in *.csv; do
cp "$f" "$TMPDIR"
# remove duplicate lines but keep order
perl -ne 'print if ++$k{$_}==1' "$TMPDIR/$f" > "$f"
done
-d
dizinleri kontrol eder. 2.) Bu sinyaller için sonlandırma zaten varsayılan değerdir.
mktemp -d -t <prefix>