Saya mencoba untuk mendapatkan tanggal modifikasi terakhir dari file dengan perintah ini
TM_LOCAL=`ls -l --time-style=long-iso ~/.vimrc | awk '{ print $6" "$7 }'`
TM_LOCAL memiliki nilai seperti "2012-05-16 23:18" setelah eksekusi baris ini
Saya juga ingin memeriksa PIPESTATUS untuk melihat apakah ada kesalahan. Misalnya jika file tidak ada, ls
mengembalikan 2. Tetapi $?
memiliki nilai 0 karena memiliki nilai pengembalian sebesar awk
.
Jika saya menjalankan perintah ini sendirian, saya dapat memeriksa nilai pengembalian ls dengan melihat ${PIPESTATUS[0]}
ls -l --time-style=long-iso ~/.vimrc | awk '{ print $6" "$7 }'
Tetapi $PIPESTATUS
tidak berfungsi seperti yang saya harapkan jika saya menetapkan output ke variabel seperti pada contoh pertama. Dalam hal ini, $PIPESTATUS
array hanya memiliki 1 elemen yang sama dengan$?
Jadi, pertanyaannya adalah, bagaimana saya bisa mendapatkan keduanya $PIPESTATUS
dan menetapkan output ke variabel secara bersamaan?
Gunakan
set -o pipefail
dibash
untuk mendapatkan kode keluar paling kanan bukan nol dalam urutan perintah pipa sebagai$?
. Dariman bash
:Maka Anda cukup mengakses
$?
. Gunakanset +o pipefail
untuk menonaktifkan lagi.sumber
Saya berasumsi masalahnya di sini adalah bahwa PIPESTATUS hilang secara keseluruhan segera setelah Anda menjalankan perintah. Anda bisa mendapatkan array PIPESTATUS lengkap di bash versi 2 atau lebih tinggi dengan cara ini:
Kemudian akses
${status[0]}
,${status[1]}
dllsumber
Masalah utama dengan "apa yang Anda harapkan" adalah bahwa sebuah perintah dalam backquotes dieksekusi dalam sebuah subkulit;
$PIPESTATUS
ada di sana dan status yang dikembalikan dari saya mengikuti aturan yang sama seperti jika Anda mengeksekusi satu executable (atau skrip shell). Status perintah backquote adalah status paling kanan (awk
).Untuk mengimplementasikan apa yang dikatakan @ Daniel Beck , setel
pipefail
opsi dalam subkulit dengan demikian:TM_LOCAL=`set -o pipefail; ls -l --time-style=long-iso ~/.vimrc | awk '{ print $6" "$7 }'`
sekarang status yang disimpan$?
setelahnya akan menjadi statusls
(jika bukan nol).Namun, saya pikir
if [ -f ~/.vimrc ];
tes eksplisit ... akan lebih mudah dibaca.Anda tidak bisa mendapatkan output ke variabel dan
PIPESTATUS
dikembalikan tanpa file sementara untuk yang pertama, atau menyusun yang terakhir menjadi string.sumber
Saya ingin mengirim email hanya jika status keluarnya tidak nol
Triknya adalah untuk mendapatkan stdin untuk akhir pipa, Anda harus meletakkannya dalam subkulit - tetapi itu tampaknya menyembunyikan nilai PIPESTATUS ...
test cron mengeluarkan beberapa output dan keluar dengan 1 atau 0 ..
UPDATE: PIPESTATUS tidak terlihat sampai perintah pipa diproses
sumber
Satu pilihan adalah untuk memeriksa keberadaan file Anda sebelum mendapatkan waktu modifikasi dengan panggilan ke
stat
. Karenastat
mengembalikan sedikit lebih banyak daripada yang Anda inginkan di cap waktu, Anda dapat memotongnya menggunakan ekspansi parameter.Dengan GNU
stat
(misalnya di Linux), Anda dapat menjalankan:Pada Mac OS X dan sistem BSD lainnya,
stat
sintaks berbeda dan dapat menentukan format waktu:sumber
$TM_LOCAL
aman. Ini hanya aman jika Anda mengharapkannya tidak memiliki nilai sebelumnya. Katakan nilainya sebelumnya2020-02-27 17:14
dan tidak ada~/.vimrc
file. Anda kemudian akan memilikinya2020-02-27 17
. Karena itu saya akan rantai dua baris bersama-sama dengan tambahan&&
atau (lebih disukai karena itu tidak begitu terbaca) menggunakanif
bait.