Di Bash Anda dapat mengarahkan ulang semua keluaran stdout masa depan dari skrip yang saat ini berjalan . Misalnya dengan skrip ini,
exec > >(logger -t my-awesome-script)
echo 1
echo 2
echo 3
Ini akan berakhir di syslog:
Oct 26 01:03:16 mybox my-awesome-script[72754]: 1
Oct 26 01:03:16 mybox my-awesome-script[72754]: 2
Oct 26 01:03:16 mybox my-awesome-script[72754]: 3
Tapi ini khusus Bash dan eksekutif telanjang dengan pengalihan tampaknya tidak bekerja di Dash.
Syntax error: redirection unexpected
Bagaimana saya bisa membuatnya bekerja di Dash, atau mungkin di kedua shell?
>
di dash. Saya sadar Anda sepertinya meminta sesuatu yang lain, tetapi saya tidak tahu apa itu.Jawaban:
Anda bisa melakukannya:
Anda dapat melakukannya dengan shell apa pun.
Jika Anda tidak suka tampilannya, mungkin buat skripnya sendiri dalam suatu fungsi.
sumber
run ${1+"$@"} || do stuff
sehingga argumen tetap dipertahankan.${1+"$@"}
tidak melakukan apa-apa"$@"
. Lagi pula itu punya masalah lain."$@"
akan lewat""
ketika tidak ada argumen sementara${1+"$@"}
akan melewati string kosong ketika tidak ada argumen. Ini sangat berarti bagi banyak program, karena mereka mengurai""
sebagai argumen kosong sedangkan string kosong (tidak dikutip) tidak akan ditafsirkan sebagai argumen sama sekali.dash
pada sistem seperti itu) , tetapi sebaliknya"$@"
unik karena case zero-args tidak menggantikan argumen null untuk shell POSIX."${@+is especially cool $@}"
,. Tapi praktis tidak jauh berbeda dari${1+”$@"}
solusi lama . Jika Anda memiliki ksh93:"${1+quoted" not quoted "quoted again}"
Substitusi proses mudah disimulasikan dengan pipa bernama.
Faktanya, pipa bernama adalah salah satu mekanisme (yang lain
/dev/fd
) yang dengannya proses substitusi dapat diimplementasikanbash
.sumber
Saya rasa ini tidak mungkin dilakukan
dash
. Sejauh yang saya tahu dariman
halamannya , tidak ada dukungan untuk proses substitusi.Sebagai solusinya, Anda bisa mencoba apa yang disarankan mikserv , atau Anda dapat mengarahkan ulang semuanya ke file, dan kemudian setelah skrip Anda selesai (mungkin ini ada dalam skrip), tambahkan konten file itu ke logger:
sumber
dash
shell lainnya. Substitusi proses hanya sejumlah argumen yang menunjuk ke/dev/fd/[num]
tautan ke pipa anonim.dash
di sini-dokumen dengan pipa anonim daripada membuat file temp seperti kebanyakan shell lainnya. Jadicat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\n
tidak hanya setara secara fungsional, Anda bahkan bisa menamai fd sendiri. Namun, poin Anda dibuat dengan baik tentang pergi ke arah lain - Anda perlu membuka fd baru denganexec
dan latar belakang proses yang membacanya.cat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\n
"lebih mudah" daripadacat <(get output)
?< >
pengalihan shell. pada dasarnya jika Anda hanya melakukan dua dari itu Anda kemudian dapat menumpuk di baris berikut juga. Tapi ya, Anda ada benarnya - saya suka di sini docs. Namun, sebanyak hal yang mungkin perlu diingat, lebih mudah ketika mereka bekerja secara universal, saya pikir. Kemudian lagi banyak orang tidak memiliki banyak kegunaan untuk kerang lain dan jadi tidak ada bedanya bagi mereka. Aku tidak ada di antara mereka./dev/fd/3
(dalam bentuk yang tepat), dan detail dari apa yang terjadi pada spasi putih. . . dan dalam hal ini, fakta bahwa seluruh pendekatan ini bekerja di Dash, ketika itu tidak bekerja di shell lain yang memiliki semua komponen, berarti bahwa pendekatan keseluruhan adalah aturan khusus yang perlu diingat. (Ini mengingatkan saya pada upaya untuk menciptakan bahasa Inggris yang disederhanakan dengan kosakata yang lebih sedikit; mereka memotong kata-kata seperti bertahan , tetapi mereka mengabaikan idiom yang sama sulitnya seperti terus .)