เป็นไปได้ไหมที่จะพิมพ์ส่วนขยายของเชลล์?


18

ฉันรู้ว่ามีกฎเฉพาะชุดที่เชลล์ขยายคำสั่งที่ผู้ใช้พิมพ์ (เรามาพูดถึง bash shell กันเถอะ)

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

เช่น

$ echo *

{all the filenames in current dir}

ฉันต้องการพิมพ์คำสั่งที่ขยายออกซึ่งเป็นบรรทัดต่อไปนี้:

echo {all the filenames in .}

คำตอบ:


13

เพียงใช้echo... วางไว้ข้างหน้าคำสั่งที่คุณต้องการขยาย ฉันใช้มันค่อนข้างบ่อย

$ ls
one.txt
two.txt
three.dat
$ echo rm *.txt
rm one.txt two.txt
$ rm *.txt

คุณสามารถใช้HomeและDelได้อย่างรวดเร็วเพิ่ม / echoลบก่อนหน้านี้

แก้ไข
ฐานะที่ชี้ให้เห็นในความคิดเห็นนี้จะไม่ทำงานหากคำสั่งไม่ได้เป็นเพียงคำสั่งง่ายๆ (เช่นถ้ามันเป็นforห่วงใช้ท่อ|หรือ&&หรือสิ่งอื่นที่ต้องการ)


1
นี่คือสิ่งที่ฉันทำเมื่อทำการทดสอบสคริปต์
Barmar

สิ่งนี้ยังได้รับผลกระทบจากโทเค็นเชลล์อื่น ๆ ที่echo cat * | someprogramไม่ได้ทำในสิ่งที่คุณอาจคิดว่าจากคำตอบนี้
Kroltan

13

set -xคุณสามารถใช้

ตัวอย่างเช่นพิจารณาสคริปต์:

$ cat script.sh
set -x
echo *

เมื่อเรียกใช้มันจะแสดงechoคำสั่งที่ขยายก่อนที่จะดำเนินการจริง:

$ bash script.sh
+ echo file1 file2 file3 script.sh
file1 file2 file3 script.sh

และตามที่ Kundor ชี้ให้เห็นสิ่งนี้ยังทำงานแบบโต้ตอบบนบรรทัดคำสั่ง:

$ set -x
+ set -x
$ echo *
+ echo file1 file2 file3 script.sh
file1 file2 file3 script.sh

เอกสาร

man bashอธิบายสิ่งที่set -xไม่เป็นดังนี้:

หลังจากขยายแต่ละคำสั่งง่าย ๆ สำหรับคำสั่งคำสั่ง case เลือกคำสั่งหรือเลขคณิตสำหรับคำสั่งแสดงค่าที่ขยายของ PS4 ตามด้วยคำสั่งและอาร์กิวเมนต์ที่ขยายหรือรายการคำที่เกี่ยวข้อง

ค่าเริ่มต้นสำหรับPS4คือตามที่แสดงข้างต้นเครื่องหมายบวกตามด้วยช่องว่าง


2
และมันก็ใช้งานได้ดีในเชลล์แบบโต้ตอบเช่นกัน (ซึ่งฉันคิดว่า OP กำลังมองหา)
Nick Matteo

7

สำหรับเชลล์แบบโต้ตอบการกดCtrl+xตามด้วย*หลังจากพิมพ์รูปแบบ glob จะแก้ไขบรรทัดคำสั่งของคุณด้วยรูปแบบ glob ที่ขยาย จากหน้าคนทุบตี:

glob-expand-word ( C-x *)

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

คุณอาจสนใจ glob-list-expansions ( Ctrl+x, g)


ฉันกำลังใช้ bash จาก Mac OS ฉันลอง ctrl + x, command + x ฉันไม่แน่ใจว่ามันจะแก้ไขบรรทัดคำสั่งใด ๆ คุณสามารถอธิบายรายละเอียดเพิ่มเติมได้หรือไม่
Weishi Zeng

@ WeishiZeng ฉันไม่รู้ว่าทำไมมันถึงไม่เหมาะกับคุณ คุณกดCtrl+x, *ทันทีหลังจากพิมพ์echo *และก่อนกดปุ่ม Enter หรือไม่ หากยังใช้งานไม่ได้คุณสามารถแก้ไข~/.inputrcและผูก glob-expand-word กับสิ่งอื่นได้
jamesdlin

contrl + x เลื่อนเคอร์เซอร์ไปที่คำว่า echo แต่ไม่แก้ไขอะไรเลย "Ctrl + x " หมายความว่าอย่างไร ?? (มันคือ ctrl + x หรือ ctrl + ??) * เป็น Shift ดังนั้นฉันต้องกด Shift ด้วยเพื่อรับ * ใช่ไหม?
Weishi Zeng

ขวากดตามด้วยCtrl+x Shift+8คุณสามารถลองดูว่าCtrl+x, gทำงานได้หรือตามที่ฉันบอกไว้ก่อนหน้าให้กำหนดรหัสของคุณเองใน.inputrcไฟล์
jamesdlin

1

หากคุณต้องการดูว่าอาร์กิวเมนต์มีการขยายหรือโทเค็นอย่างไรคุณสามารถใช้โปรแกรมหรือสคริปต์ที่พิมพ์อาร์กิวเมนต์ นี่คือการใช้งานหนึ่งในbash:

#!/bin/bash

for (( i = 0; i <= $#; ++i )); do
    printf 'argv[%d] = %s\n' $i "${!i}"
done

สมมติว่าคุณใส่ไฟล์นั้นลงในไฟล์ที่ชื่อว่าprintargs.sh(และทำให้มันทำงานได้) จากนั้นคุณจะได้ผลลัพธ์เช่นนี้

$ ./printargs.sh a{1..3}b
argv[0] = ./printargs.sh
argv[1] = a1b
argv[2] = a2b
argv[3] = a3b
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.