GNU/Linux >> Belajar Linux >  >> Linux

Hasil Kata Kunci Bash Time Hanya Dengan Perintah Pipa Kedua, Jelaskan Mengapa?

Saya memiliki perintah kata kunci bash time yang tidak dapat saya jelaskan sepenuhnya, tetapi berhasil untuk saya.

Tujuan Saya:

  1. untuk menemukan waktu eksekusi beberapa skrip python, yang mengambil variabel btw, dari dalam skrip bash, dan menangkap nilai itu.

  2. juga untuk menangkap output dari skrip python dalam variabel yang sama, untuk analisis keberhasilan atau kegagalan.

Setelah membaca sekitar saya berakhir dengan perintah ini, tetapi saya tidak sepenuhnya dapat menjelaskannya.

ttime=$( (TIMEFORMAT="%U^"; time  /../myscript.py ${__myvar} 2>&1 )|& tr -d f)

Bisakah Anda menjelaskan mengapa saya membutuhkan perintah kedua tr -d f dalam pipa, untuk nilai waktu yang akan ditambahkan ke output dari perintah,

Pilihan 'tr -d f' sepenuhnya arbitrer, dan tidak akan memengaruhi output skrip saya, std atau err, tetapi tanpa itu, atau perintah lain yang bertindak pada output teks skrip dalam beberapa cara kecil, saya melihat pengembalian dari python tanpa penambahan waktu, kenapa?

Sunting:

Pertanyaan sebenarnya adalah mengapa |& tr -d f . diperlukan, dan seperti yang dikatakan Stephanie, |&yang memungkinkan pengaturan waktu yang ditemukan di sterr dari kata kunci time untuk diteruskan ke output pipeline

Solusi sekarang terlihat seperti:

ttime=$(TIMEFORMAT="%U^"; { time /../myscript.py ${__myvar} ; } 2>&1 )

Tutorial Deskriptor Bidang:

http://wiki.bash-hackers.org/howto/redirection_tutorial

Jawaban yang Diterima:

Di bash , seperti di ksh , time adalah kata kunci (bukan bawaan) yang digunakan untuk mengatur waktu pipa (tidak hanya perintah sederhana, ia juga dapat mengatur waktu perintah majemuk).

Dalam time cmd 2> something , kami mengatur waktu cmd 2> something dan mencetak output ke stderr, tetapi ke stderr asli.

Anda perlu stderr dialihkan sebelum time konstruksi dipanggil. Yang Anda lakukan dengan |& . Anda yang mengalihkan stdout dan stderr dari subkulit time dijalankan, tetapi cara yang lebih sederhana adalah:

time=$(TIMEFORMAT="%U^"; { time cmd; } 2>&1)

Itu tidak melibatkan subkulit (di sini kami menggunakan grup perintah sebagai gantinya) atau perintah tambahan.

Perhatikan bahwa dengan bash :

time=$(time (cmd) 2>&1)

terjadi untuk bekerja secara tidak sengaja. Saya tidak akan mengandalkan itu karena mungkin berubah di versi mendatang dan tidak berfungsi di shell lain yang memiliki time kata kunci.

Jika Anda hanya menginginkan keluaran waktu dalam $time (dan bukan stdout atau stderr perintah), Anda akan melakukan:

{ time=$(TIMEFORMAT="%U^"; { time cmd 2>&3 3>&-; } 2>&1); } 3>&1

Linux
  1. Perintah yang digabungkan dengan operator kontrol di Bash

  2. Tutorial Perintah waktu Linux untuk Pemula (dengan Contoh)

  3. 15 Perintah Bawaan Bash Shell yang Berguna (Dengan Contoh)

  1. Jadwalkan tugas dengan Linux pada perintah

  2. Skrip Bash Dengan `set -e` Tidak Berhenti Pada Perintah `… &&...`?

  3. '&&' vs. '&' dengan perintah 'test' di Bash

  1. Mengapa Mengatur Variabel Sebelum Perintah Legal Di Bash?

  2. Mendapatkan info dengan perintah vsish (hanya esxi)

  3. perintah bash watch dengan warna dipertahankan