POSIX komutu / işlem ikamesi
_log()( x=0
while [ -e "${TMPDIR:=/tmp}/$$.$((x+=1))" ]
do continue; done &&
mkfifo -- "$TMPDIR/$$.$x" &&
printf %s\\n "$TMPDIR/$$.$x" || exit
exec >&- >/dev/null
{ rm -- "$TMPDIR/$$.$x"
logger --priority user."$1" --tag "${0##*/}"
} <"$TMPDIR/$$.$x" &
) <&- </dev/null
Bunu şu şekilde kullanabilmelisiniz:
exec >"$(_log notice)" 2>"$(_log error)"
mktemp
Komutu kullanan bir sürüm :
_log()( p=
mkfifo "${p:=$(mktemp -u)}" &&
printf %s "$p" &&
exec <&- >&- <>/dev/null >&0 &&
{ rm "$p"
logger --priority user."$1" --tag "${0##*/}"
} <"$p" &
)
... aynı şeyi yapar, ancak mktemp
sizin için dosya adını seçmenize izin verir . Bu, süreç ikamesi hiçbir şekilde büyülü olmadığı ve ikame komutuna çok benzer bir şekilde çalıştığı için çalışır . Genişletme yerine komut ikamesi gibi içinde çalıştırılan komutun değerini değiştirmek yerine , işlem ikamesi , çıktının bulunabileceği bir dosya sistemi bağlantısının adıyla değiştirilir.
POSIX kabuğu böyle bir şeye doğrudan bir sonuç vermese de, taklit etmek çok basit bir şekilde yapılır. Yapmanız gereken tek şey bir dosya yapmak, adını bir komut değiştirme dışında standart olarak yazdırmak ve aynı dosyanın arka planında o dosyaya verilecek komutunuzu çalıştırmaktır. Şimdi sadece bu genişlemenin değerine yönlendirebilirsiniz - tıpkı süreç ikamesi gibi. Ve böylece POSIX kabuğu, elbette ihtiyacınız olan tüm araçları sağlar - tek gereken, onları size uygun bir şekilde kullanmanızdır.
Yukarıdaki sürümlerin her ikisi de, hiç kullanmadan önce oluşturdukları / kullandıkları boruların dosya sistemi bağlantısını yok etmelerini sağlar. Bu, olaydan sonra herhangi bir temizleme gerekmediği anlamına gelir ve daha da önemlisi, akışları yalnızca başlangıçta açılan işlemler için kullanılabilir - ve bu nedenle dosya sistemi bağlantıları, günlük etkinliğinizi gizlemek / kaçırmak için bir araç olarak kullanılamaz. Fs-linklerini dosya sisteminde bırakmak potansiyel bir güvenlik açığıdır.
Başka bir yol onu sarmaktır. Senaryo içinden yapılabilir.
x=${x##*[!0-9]*}
_log(){
logger --priority user."$1" --tag "${0##*/}"
} 2>/dev/null >&2
cd ../"$PPID.$x" 2>/dev/null &&
trap 'rm -rf -- "${TMPDIR:-/tmp}/$PPID.$x"' 0 ||
{ until cd -- "${TMPDIR:=/tmp}/$$.$x"
do mkdir -- "$TMPDIR/$$.$((x+=1))"
done &&
x=$x "$0" "$@" | _log notice
exit
} 2>&1 | _log error
Bu, temel olarak henüz komut dosyanızın kendisini çağırmasına izin verir ve önyükleme için geçici bir çalışma dizini alır.