Alias ​​multi baris dalam bash

13

Saya memiliki skrip berikut. Ini adalah uji kasus sederhana di mana anilai string apa pun dan bseharusnya menjadi path.

#!/bin/bash

alias jo "\
echo "please enter values "\
read a \
read -e b \
echo "My values are $a and $b""

Namun setiap kali saya mencoba untuk mengeksekusi ./sample.sh saya mendapatkan kesalahan berikut:

./sample.sh: line 3: alias: jo: not found
./sample.sh: line 3: alias: echo please: not found
./sample.sh: line 3: alias: enter: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: read a read -e b echo My: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: are: not found
./sample.sh: line 3: alias: and: not found
./sample.sh: line 3: alias: : not found

dan ketika saya mencoba source sample.shsaya mendapatkan yang berikut:

a: Undefined variable.

Tujuan saya adalah menjadikan ini sebagai alias sehingga saya dapat sumber skrip ini dan jalankan saja alias untuk menjalankan baris perintah. Bisakah seseorang melihat ini dan memberi tahu saya apa kesalahannya?

Jovin Miranda
sumber
3
Saat Anda merasa perlu alias multiline dan multi-perintah, sekarang saatnya menentukan fungsi atau membuat skrip.
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy mencatat bahwa
Jovin Miranda

Jawaban:

15

Anda memiliki beberapa masalah di sini

  1. tidak seperti in csh, in bash(dan cangkang mirip Bourne lainnya), alias diberi =tanda misalnyaalias foo=bar

  2. kutipan tidak bisa disarangkan seperti itu; dalam hal ini, Anda dapat menggunakan tanda kutip tunggal di sekitar alias dan tanda kutip ganda di dalam

  3. backslash \adalah karakter kelanjutan garis : secara sintaksis, itu membuat perintah Anda menjadi satu baris (kebalikan dari yang Anda inginkan)

Begitu

#!/bin/bash

alias jo='
echo "please enter values "
read a 
read -e b 
echo "My values are $a and $b"'

Pengujian: pertama-tama kita sumber file:

$ . ./myscript.sh

kemudian

$ jo
please enter values 
foo bar
baz
My values are foo bar and baz

Jika Anda ingin menggunakan alias di dalam skrip, ingatlah bahwa alias hanya diaktifkan secara default di shell interaktif: untuk mengaktifkannya di dalam skrip, Anda perlu menambahkan

shopt -s expand_aliases

Terlepas dari semua hal di atas, Anda harus mempertimbangkan untuk menggunakan fungsi shell daripada alias untuk hal-hal seperti ini

Steeldriver
sumber
1
Alasan lain untuk menggunakan tanda kutip tunggal di sekitar alias adalah bahwa variabel di dalam tanda kutip ganda diperluas, jadi $adan $bakan diperluas pada waktu definisi, bukan ketika alias dijalankan.
Barmar
Terima kasih atas solusinya, masalah di sini adalah meskipun saya menulis skrip seperti yang diberikan oleh Anda dan ketika saya menjalankannya saya mendapatkan jo: perintah tidak menemukan alias untuk beberapa alasan tidak bisa didaftarkan. ketika saya sumber file maka saya mendapatkan kesalahan ini tak tertandingi ". satu-satunya alasan saya melakukan alias dan tidak berfungsi adalah karena saya ingin memanggil baris kode ini pada baris perintah dan dalam fungsi saya tidak tahu bagaimana mencapainya. saya telah melihat function call biasanya ada di dalam skrip. Penggunaan alias hanya untuk memastikan saya bisa menggunakannya seperti fungsi dan memanggilnya kapan saja saya mau
Jovin Miranda
Bagaimanapun diperbaiki, saya menggunakan shell default sebagai tcsh maka masalahnya akan datang.
Jovin Miranda
8

Biasakan menggunakan fungsi dalam shell tipe-POSIX. Anda tidak memiliki masalah kutipan:

jo () {
    read -p "Enter value for 'a': " -e a 
    read -p "Enter value for 'b': " -e b 
    echo "My values are $a and $b"
}
glenn jackman
sumber
Terima kasih atas solusinya, ini berhasil ketika saya memanggil fungsi di dalam skrip. Bagaimana saya memanggil fungsi dari baris perintah itu sendiri, karena saya memiliki beberapa skrip seperti itu dan lebih suka situasi di mana saya menulis semua fungsi dalam satu file tetapi memanggil mereka dari baris perintah sebagai gantinya. Itulah alasan utama saya memilih alias
Jovin Miranda
Persis sama. Masukkan fungsi dalam file dan sumber file itu
glenn jackman
mengerti apa yang sebenarnya saya lakukan adalah menggunakan foll. perintah "$ @" sehingga saya bisa memanggil nama fungsi saat mengeksekusi file
Jovin Miranda