Pertanyaan Alihkan stdout ke stderr di tcsh


Dari pengertian saya, yang berikut ini harus mengirim 'test'pada kesalahan standar di tcsh:

echo test >&2

Namun, ia malah menulis 'test'ke sebuah file bernama 2, dan ketika saya melihat sejarah saya, saya menemukan bahwa apa yang sebenarnya dieksekusi adalah

echo test > & 2

Saya tidak yakin lapisan apa yang memasukkan ruang tersebut, tetapi dapatkah saya menghentikannya? Jika tidak, saya kira saya selalu bisa menggunakannya > /dev/stderr sebagai gantinya.


4
2018-05-23 14:28


asal


echo test >&2 mencetak ke stderr. Setidaknya di pesta saya. - Der Hochstapler
BTW, menggunakan > sebagai indikator shell cukup membingungkan dalam cuplikan kode Anda dalam konteks saat ini;) - Der Hochstapler
Awalnya saya juga mengira bahwa itu adalah tsch. - Dave Forgac
Maaf atas kebingungannya, semoga pertanyaan saya lebih jelas sekarang. Jika saya bisa menggunakan bash di sini, saya akan melakukannya, karena ini bekerja untuk saya. - Nate Parsons
Bisakah Anda mengutip pengalihan? echo test '>&2'? Tidak tahu apakah itu berfungsi, dan tidak perlu tcsh untuk mencobanya. - kevlar1818


Jawaban:


Tentang csh, dari http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/:

Sepanjang baris yang sama ini, Anda tidak dapat mengarahkan pesan kesalahan dalam skrip csh keluar stderr seperti yang dianggap tepat. Dalam cangkang Bourne, Anda mungkin berkata:

echo "$0: cannot find $file" 1>&2

tetapi dalam csh, Anda tidak dapat mengalihkan stdout keluar, sehingga Anda akhirnya melakukan sesuatu yang konyol seperti ini:

sh -c 'echo "$0: cannot find $file" 1>&2'

Saya melakukan beberapa upaya cepat dengan tcsh, dan seperti yang dicurigai tampaknya benar untuk itu juga (tcsh seharusnya sepenuhnya kompatibel dengan csh).


Untuk menjawab pertanyaan Anda yang dirumuskan: itu tidak masalah jika Anda bisa membuatnya tcsh bukan "menyisipkan spasi" karena itu tidak akan menafsirkan urutan itu dengan cara yang dimaksudkan pula.


5
2018-05-24 09:29





EDIT:

Saya tidak melihat ini tsch. Lihat bagian "Input / output" dari man tsch untuk detail termasuk ini:

Keluaran diagnostik dapat diarahkan melalui pipa dengan standar   keluaran. Cukup gunakan formulir | & bukan hanya |.

Shell tidak dapat langsung mengarahkan output diagnostik tanpa juga   mengarahkan output standar, tetapi (command> output-file)> & error-file   sering merupakan solusi yang dapat diterima. Entah file output atau file kesalahan   mungkin / dev / tty untuk mengirim out-put ke terminal.


5
2018-05-23 14:34



Terima kasih telah menunjukkannya, tetapi saya tidak yakin itu berlaku. Saya tidak ingin mengarahkan output diagnostik (stderr?) Dari suatu proses, sebagai gantinya saya ingin output normal muncul di stdout. - Nate Parsons
@Remaman: Pada dasarnya itu hal yang sama. Apa yang Anda lakukan adalah memulai echo memproses dan mengarahkan outputnya ke stderr. Dengan demikian, mencetak ke stderr secara efektif :) - Der Hochstapler
Itu bukan cara kerjanya. (echo test > out) >& err menulis 'test' ke file bernama 'out' dan membuat file kosong 'err' di komputer saya, setidaknya. - Nate Parsons
Ini cara yang bagus untuk mendapatkannya STDOUT dan STDERR terpisah dari perintah mengirim output ke keduanya, dan mengirimnya ke file. Namun, ya tidak jawab pertanyaan OP tentang cara memaksa STDOUT (yang mana echo mengirim output) untuk pergi ke STDERR di tcsh. - Randall


Solusi Daniel Andersson sangat bagus dan akan berfungsi dengan baik jika perintah yang ingin Anda jalankan dapat dijalankan dari sh (dan, karenanya, subkulit, yang tidak akan dapat mengubah direktori atau memodifikasi lingkungan shell Anda saat ini). Jika Anda ingin mengonversi stdout ke stderr tetapi tetap menjalankan perintah dalam shell saat ini, Anda dapat menggunakan bash hanya untuk pengalihan stdout-ke-stderr, seperti ini:

echo "Pesan kesalahan" | bash -c "cat - 1> & 2"


3
2018-04-30 20:17





Saya melakukan beberapa eksperimen dengan mengarahkan ke / dev / stderr dalam skrip tcsh. Saya maksudnya adalah agar pengguna skrip dapat (juga dalam tcsh) langsung output standar dan kesalahan standar ke tempat yang berbeda. Saya menemukan bahwa skrip harus seperti:

echo 1abc
echo 1ABC >>& /dev/stderr
echo 2abc
echo 2ABC >>& /dev/stderr

Jika Anda tidak menggunakan >>, maka pada output skrip yang dialihkan, Anda kalah beberapa input standar dan / atau data keluaran standar. Meski begitu, mengarahkan kembali output dari skrip ke file dengan menggunakan> & lakukan tidak kerja; itu juga kehilangan bagian dari kesalahan standar (bahkan pada bash). Kamu harus Gunakan

(SCRIPT >! file.out ) >&! file.err

membangun. Di sini file atau keduanya bisa menjadi / dev / tty untuk keluaran ke layar. (Jika Anda tidak mengarahkan output skrip, tidak akan ada masalah.)

Perhatikan bahwa tidak ada keanehan ini terjadi jika Anda mengarahkan ke kesalahan standar dari di dalam sebuah program.

Juga perhatikan bahwa ini ada di Linux (Ubuntu-MATE LTS 16.04, tepatnya). Tentu saja Anda perlu setidaknya / dev / stderr ada untuk hal di atas dapat digunakan.

Setelah posting ini, saya masih menemukan masalah lain. Jika Anda meletakkan program yang menulis ke kesalahan standar setelah garis 1ABC, maka 1ABC akan hilang jika Anda kesalahan standar langsung ke file. Kabar baiknya adalah bahwa dalam kasus saya, standar kesalahan harus berlanjut ke / dev / tty. Wah. :)

Untuk memungkinkan modifikasi yang mudah, dan sistem tanpa / dev / stderr, saya telah memutuskan untuk menerapkan ini melalui dua baris header berikut

alias stderr echo ; if (-ew /dev/stderr) alias stderr 'echo \!* >> /dev/stderr'
which echo_err > /dev/null ; if !($status) alias stderr echo_err

Ini memungkinkan pengguna untuk memasang echo_err script sh,

#!/bin/sh
echo $* 1>&2

di jalan jika pengalihan bebas bug kesalahan standar benar-benar diperlukan (di biaya dua aktivasi gambar).

Tambahan lainnya: Posting saya di atas adalah tentang masalah dalam mengarahkan ke / dev / stderr dalam tcsh. Tapi selama saya memberi alias, mungkin saya juga harus memberi satu untuk solusi Glen Ragan, yang sangat bagus jika Anda tidak keberatan aktivasi gambar. Menetapkan

alias 1to2 '\!* | sh -c "cat 1>&2"'
alias 2to1 '\!* |& cat'

Kemudian Anda dapat mendahului setiap perintah yang Anda inginkan output standar akan dialihkan ke stdout oleh 1to2. Itu bertindak kemudian sama seperti mendahului perintah dengan 1> & 2 di shell lain, termasuk DOS. Dan itu tidak buggy di Linux. Mungkin juga memiliki 2to1 juga, lalu. :)

OOPS: Cacat kecil di 1to2 di atas: jika perintah menulis ke output standar dan kesalahan standar, urutannya salah. Hal-hal kesalahan standar perintah berakhir sebelum barang standarnya dalam hasil kesalahan standar akhir. Solusinya sederhana; ganti | ke | &:

alias 1to2 '\!* |& sh -c "cat 1>&2"'

Maaf soal itu.


1
2018-03-01 18:02