GNU/Linux >> Belajar Linux >  >> Linux

Apa Arti ${1+“[email protected]”} Dalam Skrip Shell, Dan Apa Bedanya dengan “[email protected]”?

Dalam dokumentasi Perl, perlrun(1) menyarankan untuk meluncurkan skrip Perl menggunakan header dwibahasa shell/Perl:

#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"[email protected]"}'
    if 0;

Apa yang ${1+"[email protected]"} berarti? Saya mencoba menggunakan "[email protected]" sebagai gantinya (menggunakan Bash sebagai /bin/sh), dan tampaknya berfungsi dengan baik.

Sunting

Dua jawaban di bawah mengatakan bahwa seharusnya ${1:+"[email protected]"} . Saya mengetahui ${parameter:+word} Sintaks (“Gunakan Nilai Alternatif”) yang didokumentasikan dalam bash(1). Namun, saya tidak yakin, karena

  1. Keduanya ${1+"[email protected]"} dan "[email protected]" bekerja dengan baik, bahkan ketika tidak ada parameter. Jika saya membuat simple.sh sebagai

    #!/bin/sh
    eval 'exec /usr/bin/perl -x -S -- $0 "[email protected]"'
        if 0;
    #!perl
    use Data::Dumper;
    print Dumper(\@ARGV);
    

    dan question.sh sebagai

    #!/bin/sh
    eval 'exec /usr/bin/perl -x -S -- $0 ${1+"[email protected]"}'
        if 0;
    #!perl
    use Data::Dumper;
    print Dumper(\@ARGV);
    

    Saya bisa membuat keduanya bekerja secara identik:

    $ ./question.sh 
    $VAR1 = [];
    $ ./question.sh a
    $VAR1 = [
              'a'
            ];
    $ ./question.sh a 'b c'
    $VAR1 = [
              'a',
              'b c'
            ];
    $ ./question.sh ""
    $VAR1 = [
              ''
            ];
    $ ./simple.sh 
    $VAR1 = [];
    $ ./simple.sh a
    $VAR1 = [
              'a'
            ];
    $ ./simple.sh a 'b c'
    $VAR1 = [
              'a',
              'b c'
            ];
    $ ./simple.sh ""
    $VAR1 = [
              ''
            ];
    
  2. Sumber lain di Internet juga menggunakan ${1+"[email protected]"} , termasuk seorang peretas yang sepertinya tahu apa yang dia lakukan.

Mungkin ${parameter+word} adalah sintaks alternatif (atau usang) yang tidak berdokumen untuk ${parameter:+word} ? Bisakah seseorang mengkonfirmasi hipotesis itu?

Jawaban yang Diterima:

Itu untuk kompatibilitas dengan shell Bourne. Shell Bourne adalah shell lama yang pertama kali dirilis dengan Unix versi 7 pada tahun 1979 dan masih umum sampai pertengahan 90-an sebagai /bin/sh di sebagian besar Unis komersial.

Ini adalah nenek moyang dari sebagian besar kerang mirip Bourne seperti ksh , bash atau zsh .

Itu memiliki beberapa fitur canggung yang banyak di antaranya telah diperbaiki di ksh dan shell lainnya dan spesifikasi standar baru sh , salah satunya adalah ini:

Dengan shell Bourne (setidaknya varian yang belum diperbaiki):"[email protected]" diperluas ke satu argumen kosong jika daftar parameter posisi kosong ($# == 0 ) bukannya tidak ada argumen sama sekali.

${var+something} berkembang menjadi "sesuatu" kecuali $var tidak disetel. Itu didokumentasikan dengan jelas di semua shell tetapi sulit ditemukan di bash dokumentasi karena Anda perlu memperhatikan kalimat ini:

Saat tidak melakukan ekspansi substring, menggunakan formulir yang didokumentasikan di bawah ini, uji bash untuk parameter yang tidak disetel atau nol. Menghilangkan titik dua menghasilkan pengujian hanya untuk parameter yang tidak disetel .

Jadi ${1+"[email protected]"} diperluas ke "[email protected]" hanya jika $1 diatur ($# > 0 ) yang mengatasi keterbatasan shell Bourne tersebut.

Terkait:Perbedaan antara EOT dan EOF?

Perhatikan bahwa shell Bourne adalah satu-satunya shell dengan masalah itu. sh Modern modern s (yaitu sh sesuai dengan spesifikasi POSIX dari sh (yang bukan shell Bourne)) tidak memiliki masalah itu. Jadi Anda hanya memerlukannya jika Anda memerlukan kode Anda untuk bekerja pada sistem yang sangat lama di mana /bin/sh mungkin shell Bourne bukan shell standar (perhatikan bahwa POSIX tidak menentukan lokasi sh standar , jadi misalnya di Solaris sebelum Solaris 11, /bin/sh masih merupakan shell Bourne (meskipun tidak memiliki masalah khusus itu) sedangkan sh normal/standar berada di lokasi lain (/usr/xpg4/bin/sh )).

Ada masalah di perlrun halaman perldoc di $0 tidak dikutip sekalipun.

Lihat http://www.in-ulm.de/~mascheck/various/bourne_args/ untuk informasi lebih lanjut.


Linux
  1. Apa Artinya `:-` Dalam Skrip Shell?

  2. Apa Arti -s Dan [[]] Dalam Kondisi If Di Bash?

  3. Cara menjalankan skrip Python dari shell

  1. Apa itu DNS dan Bagaimana Cara Kerjanya?

  2. Apa itu Skrip Shell? Bagaimana Cara Membuat Script Shell?

  3. Apa arti nilai simbol dari perintah nm?

  1. Apa itu Makefile dan bagaimana cara kerjanya?

  2. Apa arti set -e dalam skrip bash?

  3. Apa arti sintaks |&dalam bahasa shell?