it-swarm-id.com

Penggunaan tanda hubung (-) sebagai ganti nama file

Untuk suatu perintah, jika menggunakan - sebagai argumen sebagai pengganti nama file berarti STDIN atau STDOUT.

  1. Tetapi dalam contoh ini, ia membuat file dengan nama -:

    echo hello > -
    

    Bagaimana saya bisa membuat - dalam contoh ini berarti STDOUT?

  2. Sebaliknya, bagaimana saya bisa membuat - berarti file bernama - dalam contoh-contoh seperti:

    cat -
    
121
Tim

Menggunakan - sebagai nama file yang berarti stdin/stdout adalah konvensi yang banyak digunakan oleh program. Ini bukan properti khusus dari nama file. Kernel tidak mengenali - spesial sehingga panggilan sistem apa pun yang merujuk pada - sebagai nama file akan menggunakan - secara harfiah sebagai nama file.

Dengan pengalihan bash, - tidak dikenali sebagai nama file khusus, jadi bash akan menggunakannya sebagai nama file literal.

Ketika cat melihat string - sebagai nama file, ia memperlakukannya sebagai sinonim untuk stdin. Untuk menyiasatinya, Anda perlu mengubah string yang cat lihat sedemikian rupa sehingga masih merujuk ke file bernama -. Cara yang biasa dilakukan adalah dengan awalan nama file dengan path - ./-, atau /home/Tim/-. Teknik ini juga digunakan untuk mengatasi masalah serupa di mana opsi baris perintah berbenturan dengan nama file, sehingga file disebut ./-e tidak muncul sebagai -e opsi baris perintah ke suatu program, misalnya.

169
camh
  1. Dari pada echo hello > -, kamu bisa menggunakan echo hello > /dev/stdout.

    Sementara '-' adalah konvensi yang harus dilaksanakan oleh setiap program yang ingin mendukungnya, /dev/stdin, /dev/stdout dan /dev/stderr adalah, ketika didukung oleh OS (setidaknya Solaris, Linux dan BSD melakukannya), terlepas dari aplikasi dan kemudian akan berfungsi sesuai keinginan Anda.

18
jlliagre

As camh disebutkan , - hanyalah konvensi penamaan yang digunakan oleh beberapa program. Jika Anda ingin merujuk aliran ini dengan deskriptor file Shell akan mengenali, jiliagre benar karena Anda menggunakan nama /dev/stdin atau /dev/stdout sebagai gantinya. Nama-nama file harus bekerja di mana saja nama file normal akan berfungsi.

  1. Yang sedang berkata, contoh pertama Anda agak konyol. Setiap output yang akan ditangkap oleh operator pengarah untuk menulis ke file sudah pada standar-output, jadi mengarahkan dan menulis kembali ke tempat asalnya tidak berguna. Perilaku yang Anda gunakan di sana adalah pipa, bukan redirect:

    echo hello |
    
  2. Dalam contoh kedua Anda, Anda hanya perlu memberikan beberapa indikasi bahwa Anda menginginkan file litteral dari nama itu, bukan alias internal yang dimilikinya. Anda dapat melakukan ini dengan termudah dengan menentukan jalur ke file seperti ini:

    cat ./-
    
10
Caleb

Adapun 1, program harus mendukungnya. Anda tidak bisa begitu saja menggunakannya secara sewenang-wenang. Sedangkan untuk 2, redirect input dari (mis., cat < -).

6
bahamat

Pendekatan '-' memiliki banyak masalah. Pertama-tama membutuhkan interpretasi karakter '-' dan banyak program tidak melakukan interpretasi seperti itu. Dan lebih jauh lagi, ada beberapa program yang menafsirkan tanda hubung sebagai pembatas menandai akhir opsi baris perintah. Program ditulis untuk bekerja dengan argumen nama file, pendekatan '-' adalah hack, Nice tapi lemah.

Cara terbaik adalah:

$ echo hello > /dev/fd/1

/dev/stdout adalah tautan simbolik dari /dev/fd/1

1
b3h3m0th

Karakter khusus sebagian besar memiliki dua makna:

Grafik numerik ASCII.

Scripting atau simbolis.

Mungkin saja satu karakter mewakili string, atau bertindak sebagai string. sebagai pengertian saya.

dalam bahasa C fopen() fungsi mengambil dua argumen aliran file pertama dan mode kedua di mana file akan terbuka. mode adalah string. bahkan jika itu karakter tunggal.

cat> "-" berfungsi.

0
Owais Qureshi