ชุดคำสั่งที่ไม่มีอาร์กิวเมนต์ทำอะไร


22

อะไรsetคำสั่งโดยไม่ขัดแย้งทำอย่างไร

อย่างที่ฉันเห็นมันพิมพ์ตัวแปรสภาพแวดล้อมของฉันเหมือนกับenvคำสั่ง แต่ตามลำดับตัวอักษร และยิ่งไปกว่านั้นมันยังพิมพ์ข้อมูลที่แตกต่างกัน (ฟังก์ชั่นตัวแปร?) เช่น:

__git_printf_supports_v=yes
__grub_script_check_program=grub-script-check
...
quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
quote_readline () 
{ 
    local quoted;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}

มันคืออะไรและมาจากไหน?

ฉันไม่สามารถหาข้อมูลเกี่ยวกับsetคำสั่งโดยไม่มีข้อโต้แย้ง จริงๆแล้วฉันไม่มีmanหน้าสำหรับsetการแจกจ่าย Linux เลย


1
"ตัวอาคารนี้ซับซ้อนมากจนสมควรได้รับส่วนของตัวเอง" ดูเอกสาร
galath

คำตอบ:


17

set เป็นเชลล์ในตัวที่แสดงตัวแปรเชลล์ทั้งหมดไม่เพียง แต่สภาวะแวดล้อมและฟังก์ชันของเชลล์ซึ่งเป็นสิ่งที่คุณเห็นในตอนท้ายของรายการ

ตัวแปรจะถูกแสดงพร้อมกับไวยากรณ์ที่อนุญาตให้ตั้งค่าเมื่อบรรทัดถูกเรียกใช้หรือมีที่มา

จากbash หน้าคู่มือ :

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

บนเชลล์ที่แตกต่างกันพฤติกรรมไม่จำเป็นต้องเหมือนกัน ตัวอย่างเช่นksh setไม่แสดงฟังก์ชันเชลล์


3
นั่นเป็นเพราะkshอย่าเก็บข้อกำหนดของฟังก์ชันในตัวแปรเชลล์
cuonglm

2
@cuonglm การออกแบบที่ชาญฉลาดตัดสินใจโดย dgk! ;-)
jlliagre

7

เนื่องจากsetมีเอาต์พุตและwhich setไม่ส่งคืนสิ่งที่คุณรู้ว่าเป็นส่วนหนึ่งของเชลล์ที่คุณกำลังใช้งานอาจมีการทุบตี

คนทุบตีกล่าวมาหลายครั้ง แต่ก็ง่ายต่อการเชื่อมโยงไปในเอกสารออนไลน์

สิ่งปลูกสร้างนี้มีความซับซ้อนมากจนสมควรได้รับส่วนของตัวเอง set ช่วยให้คุณเปลี่ยนค่าของตัวเลือกเชลล์และตั้งค่าพารามิเตอร์ตำแหน่งหรือเพื่อแสดงชื่อและค่าของตัวแปรเชลล์

set มีข้อกำหนดการโทรของ:

set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument …]

ดังนั้นหากคุณต้องการค้นหาด้วยตัวเองในบรรทัดคำสั่งคุณสามารถค้นหาด้วย

/set.*abef

which setขึ้นอยู่กับเปลือกของคุณ อย่างน้อยก็zshจะรายงานให้คุณทราบ นอกจากนี้คุณยังสามารถอ่านนี้สำหรับรายละเอียดเพิ่มเติม
cuonglm

มันไม่น่าเป็นคำถามที่เกี่ยวกับอะไร แต่ทุบตีเนื่องจากมีการครอบงำตลาดที่มีขนาดใหญ่และทุกคนที่ใช้เปลือกไม่ใช่เริ่มต้นจะไม่จำเป็นต้องถามคำถามนี้
user1133275

6

setเป็น shell builtinใช้สำหรับตั้งค่าและยกเลิกการตั้งค่าตัวเลือกเชลล์และพารามิเตอร์ตำแหน่ง

โดยไม่ต้องมีปากเสียงsetจะพิมพ์ตัวแปรเปลือกทั้งหมด (ทั้งตัวแปรสภาพแวดล้อมและตัวแปรในเซสชั่นปัจจุบัน) เรียงลำดับในปัจจุบันสถานที่เกิดเหตุ

นอกจากนี้คุณยังสามารถอ่านเอกสารทุบตี


มีข้อแม้อยู่เล็กน้อย

set "$var"จะกำหนดค่าให้กับvar $1หาก$varเริ่มต้นด้วย-หรือเนื้อหา+นั้น$varจะถือว่าเป็นลำดับของตัวเลือกเชลล์ หาก$varมีตัวเลือกที่ไม่ถูกต้องเชลล์ POSIX ส่วนใหญ่จะพิมพ์ข้อผิดพลาด yashและzshในsh, kshการแข่งขันไม่เพียง แต่พิมพ์ผิดพลาด แต่ยังตั้งค่าตัวเลือกที่ถูกต้อง ในขณะที่yashหยุดการตั้งค่าตัวเลือกในตัวเลือกที่ไม่ถูกต้องตัวแรกzshจะกำหนดตัวเลือกทั้งหมด ในyash:

var=-fxd; set "$var"

fและxจะนำเสนอใน$-ขณะที่:

var=fdx; set "$var"

เพียง แต่อยู่ในปัจจุบันf $-ในทั้งสองกรณีfและxจะนำเสนอ$-ด้วยzshในshและkshจำลอง

เพื่อป้องกันคุณจากสถานการณ์นั้นคุณสามารถส่งผ่าน--เป็นอาร์กิวเมนต์แรกเพื่อตั้งค่าพารามิเตอร์ตำแหน่งแม้เริ่มต้นด้วย-หรือ+:

var=-fdx; set -- "$var"

จะมอบหมาย$varให้$1โดยไม่คำนึงถึงเนื้อหา

set -- จะไม่มีการตั้งค่าพารามิเตอร์ตำแหน่งทั้งหมด

ถ้าอาร์กิวเมนต์แรกคือ-พฤติกรรมที่ไม่ได้ระบุ POSIX เชลล์ที่รู้จักทั้งหมดจะถูกยกเลิกการตั้งค่าxและvตัวเลือก (ยกเว้นposh) และกำหนดสิ่งใด ๆ หลังจาก-พารามิเตอร์ตำแหน่ง:

set -xv - -f

จะกำหนดไป-f ยังไม่ได้ล้างพารามิเตอร์ตำแหน่ง Schily oshก็ทำตัวเช่นนั้น มรดกสืบทอดไม่ได้ตั้งค่าและตัวเลือก$1set -vx

ข้อยกเว้นของ POSIX เชลล์เท่านั้นคือyashซึ่งถือว่า-เป็นพารามิเตอร์ตำแหน่งแรก:

$ yash -c 'set -xv - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
+ printf %s\n - -f
-
-f
+ printf %s\n cvx
cvx

Schilyยังไม่ทำอะไรเลยถ้า-มีข้อโต้แย้ง:

$ schily-sh -c 'set -v - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
<blank line>
s

$ schily-sh -c 'set -v -- -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
-f
vs

ฉันไม่เคยเข้าใจว่าทำไมคนจะเชื่อมโยงไปที่ใดก็ได้ แต่ครั้งแรกหนึ่ง ... คุณอาจชอบที่จะพูดถึงความแตกต่างระหว่างset -- $unset, set - $unset, set $unsetและset "$unset"และอื่น ๆ - ก็มักจะแตกต่างเหล่านั้นที่ได้รับคนที่เป็นชนิดของปัญหาในสถานที่แรกที่
mikeserv

@mikeserv: ผมเพิ่มรายละเอียดเพิ่มเติม $unsetแต่ผมไม่ได้ทำในสิ่งที่คุณหมายถึงเมื่อนำมาใช้
cuonglm

@cuonglm คำสั่งset $unsetจะทำหน้าที่เท่ากับsetตัวแปร unset แต่set "$unset" จะสังเกตถ้าunsetเป็นจริงตัวแปร unset set - $unsetลบ-vและ-xตั้งค่าตัวเลือก (ในทุบตี)

@BinaryZebra: unset_varอ่าแน่นอนสำหรับผมแล้วมันจะดีกว่าที่จะใช้ และโปรดทราบว่าset "$unset"มีการตั้งค่า$1ว่างเปล่าจริง ๆ มันเกี่ยวกับการขยายตัวของเชลล์ไม่ใช่อย่างเคร่งครัดsetดังนั้นฉันจึงไม่พูดถึงมัน
cuonglm

1
@mikeserv: พฤติกรรมของposhและyashแตกต่างกันเมื่อ-ปรากฏ คุณสามารถอ่านการปรับปรุงของฉัน (และอย่าลังเลที่จะปรับปรุง)
cuonglm

2

help setถ้าคุณกำลังทำงานอยู่ภายในเปลือกทุบตีประเภท

เมื่อสิ้นสุดความช่วยเหลือที่พิมพ์แล้วให้อ่าน:

หากไม่มีการกำหนด ARG ตัวแปรเชลล์ทั้งหมดจะถูกพิมพ์

ดังนั้นจึงไม่มีข้อโต้แย้งsetพิมพ์ตัวแปรทั้งหมดที่รู้จักกับเปลือก


ฉันสงสัยว่าset -x; setจะเป็นประโยชน์หรือไม่
ILMostro_7
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.