นามแฝงหลายบรรทัดในทุบตี


13

ฉันมีสคริปต์ต่อไปนี้ เป็นกรณีทดสอบง่ายๆที่aมีค่าสตริงใด ๆ และbควรจะเป็นเส้นทาง

#!/bin/bash

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

อย่างไรก็ตามเมื่อใดก็ตามที่ฉันพยายามเรียกใช้. /sample.sh ฉันได้รับข้อผิดพลาดต่อไปนี้:

./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

และเมื่อฉันลองsource sample.shฉันจะได้รับสิ่งต่อไปนี้:

a: Undefined variable.

เป้าหมายของฉันคือการทำให้นามแฝงนี้เพื่อให้ฉันสามารถแหล่งสคริปต์นี้และเพียงเรียกใช้นามแฝงเพื่อรันบรรทัดคำสั่ง ใครสามารถดูที่นี้และแจ้งให้เราทราบว่าข้อผิดพลาดคืออะไร?


3
เมื่อคุณคิดว่าคุณต้องการนามแฝงหลายบรรทัดและหลายคำสั่งก็ถึงเวลากำหนดฟังก์ชั่นหรือสร้างสคริปต์
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy ตั้งข้อสังเกตว่า
Jovin Miranda

คำตอบ:


15

คุณมีปัญหาสองสามข้อที่นี่

  1. แตกต่างจากในcshในbash(และอื่น ๆ บอร์นเหมือนเปลือกหอย) นามแฝงที่ได้รับมอบหมายที่มี=เช่นการเข้าสู่ระบบalias foo=bar

  2. ไม่สามารถซ้อนคำพูดเช่นนั้นได้ ในกรณีนี้คุณสามารถใช้เครื่องหมายอัญประกาศเดี่ยวล้อมรอบนามแฝงและเครื่องหมายคำพูดคู่ภายใน

  3. แบ็กสแลช\เป็นอักขระที่ต่อเนื่องของบรรทัด : syntactically ทำให้คำสั่งของคุณเป็นบรรทัดเดียว (ตรงข้ามกับสิ่งที่คุณต้องการ)

ดังนั้น

#!/bin/bash

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

การทดสอบ: ก่อนอื่นเรามาไฟล์:

$ . ./myscript.sh

แล้วก็

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

หากคุณต้องการใช้นามแฝงภายในสคริปต์โปรดจำไว้ว่านามแฝงจะเปิดใช้งานโดยค่าเริ่มต้นในเชลล์แบบโต้ตอบเท่านั้น: เพื่อเปิดใช้งานพวกเขาภายในสคริปต์คุณจะต้องเพิ่ม

shopt -s expand_aliases

โดยไม่คำนึงถึงทุกสิ่งข้างต้นคุณควรพิจารณาใช้เชลล์ฟังก์ชั่นแทนชื่อแทนสำหรับสิ่งนี้


1
อีกเหตุผลหนึ่งที่ใช้อัญประกาศล้อมรอบนามแฝงคือตัวแปรที่อยู่ในเครื่องหมายคำพูดคู่จะถูกขยายดังนั้น$aและ$bจะถูกขยายตามเวลาที่กำหนดไม่ใช่เมื่อเรียกใช้นามแฝง
Barmar

ขอบคุณสำหรับการแก้ปัญหาปัญหาที่นี่คือแม้ฉันจะเขียนสคริปต์ตามที่กำหนดโดยคุณและเมื่อฉันรันฉันได้รับ jo: คำสั่งไม่พบชื่อแทนด้วยเหตุผลบางอย่างไม่ได้ลงทะเบียน เมื่อฉันแหล่งที่มาของไฟล์แล้วฉันได้รับข้อผิดพลาดนี้ไม่ตรงกัน "เหตุผลเดียวที่ฉันทำนามแฝงและฟังก์ชั่นไม่ได้เป็นสาเหตุที่ฉันต้องการเรียกรหัสบรรทัดนี้ที่บรรทัดคำสั่งและในฟังก์ชั่นฉันไม่รู้วิธีการบรรลุว่าฉันได้เห็น สายงานเป็นปกติภายในสคริปต์ที่ใช้นามแฝงเป็นเพียงเพื่อให้แน่ใจว่าฉันสามารถใช้มันเหมือนฟังก์ชั่นและเรียกว่าเมื่อใดก็ตามที่ฉันต้องการ.
Jovin มิแรนดา

ยังไงก็ซ่อมผมใช้เชลล์เริ่มต้นเป็น tcsh ดังนั้นปัญหาที่เกิดขึ้นมา
Jovin Miranda

8

ทำความคุ้นเคยกับการใช้ฟังก์ชั่นในเปลือกประเภท POSIX คุณไม่มีปัญหาในการอ้างถึง:

jo () {
    read -p "Enter value for 'a': " -e a 
    read -p "Enter value for 'b': " -e b 
    echo "My values are $a and $b"
}

ขอบคุณสำหรับวิธีแก้ปัญหาสิ่งนี้ใช้ได้เมื่อฉันเรียกใช้ฟังก์ชันภายในสคริปต์ ฉันจะเรียกใช้ฟังก์ชันจากบรรทัดคำสั่งเองได้อย่างไรทำให้ฉันมีสคริปต์หลายตัวและต้องการให้สถานการณ์ที่ฉันเขียนฟังก์ชันทั้งหมดในไฟล์เดียว แต่เรียกใช้จากบรรทัดคำสั่งแทน นั่นคือเหตุผลทั้งหมดที่ฉันไปหานามแฝง
Jovin Miranda

มันเหมือนกันหมด ใส่ฟังก์ชั่นในไฟล์และซอร์สไฟล์นั้น
glenn jackman

ได้รับสิ่งที่ฉันทำจริง ๆ แล้วคือใช้ foll คำสั่ง "$ @" เพื่อให้ฉันสามารถเรียกชื่อฟังก์ชั่นในขณะที่รันไฟล์
Jovin Miranda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.