ตั้งค่าและเลือกซื้อ - สองทำไม


72

setและshoptเป็นทั้งบิวด์เชลล์ที่ควบคุมตัวเลือกต่าง ๆ ฉันมักจะลืมว่าตัวเลือกใดถูกตั้งค่าตามคำสั่งใดและตัวเลือกใดที่ตั้งค่า / ไม่ปลอดภัย ( set -o/+o, shopt -s/-u) เหตุใดจึงมีสองคำสั่งต่างกันที่ดูเหมือนจะทำสิ่งเดียวกัน (และมีข้อโต้แย้งต่าง ๆ ให้ทำ) มีวิธีใด / ตัวย่อช่วยจำให้จำว่ามีตัวเลือกใดบ้างที่ใช้คำสั่งใด?


6
ลองดูบรรทัดที่สองของhelp setและhelp shoptเพื่อตรวจสอบว่าแม้แต่ผู้เขียนของพวกเขาคิดว่าพวกเขาทำสิ่งเดียวกัน
l0b0

2
"เปลี่ยนค่าของคุณสมบัติของเชลล์" vs "เปลี่ยนการตั้งค่าของแต่ละตัวเลือกของเชลล์"
เควิน

2
ใน Bash 4.1.5 (1) - ปล่อยมันเขียนว่า "Set หรือ unset value ของตัวเลือกเชลล์และพารามิเตอร์ตำแหน่ง" และ "ตั้งค่าและยกเลิกการตั้งค่าตัวเลือกเชลล์" ตามลำดับ
l0b0

การเขียน manpages ทำให้คุณรู้ว่าคุณไม่รู้อะไรและทำให้คุณลองกำหนดสิ่งต่าง ๆ ในแบบที่คุณไม่ได้คิดผิดเกี่ยวกับสิ่งที่คุณลองเขียน
sjas

คำตอบ:


40

เท่าที่ฉันรู้ตัวset -oเลือกเป็นสิ่งที่สืบทอดมาจากเชลล์สไตล์ Bourne อื่น ๆ (ส่วนใหญ่เป็น ksh) และshoptตัวเลือกเป็นสิ่งที่เฉพาะเจาะจงสำหรับการทุบตี ไม่มีเหตุผลที่ฉันรู้


1
เอกสารใดที่แสดงให้เห็นว่าshoptสืบทอดมา?
Felipe Alvarez

8
ดีมีset -oตัวเลือกเช่นposix/ physical/ interactive-commentsที่ไม่อยู่ในkshและshoptคนที่อยู่ในเปลือกหอยอื่น ๆ รวมทั้งkshสำหรับบางอย่างเช่น/login_shell nullglobอย่างที่คุณพูดไม่มีตรรกะ มันอาจเป็นความคิดในตอนเริ่มต้น (ที่ SHELLOPTS จะเป็นแบบมาตรฐานและ BASHOPTS เป็นคนทุบตีเฉพาะ) แต่ก็หลงทางไปและตอนนี้มันก็กลายเป็นเรื่องน่ารำคาญและความล้มเหลวในการออกแบบ UI
Stéphane Chazelas

22

ความแตกต่างอยู่ในตัวแปรสภาพแวดล้อมที่เปลี่ยนแปลงที่ใช้โดย bash การตั้งค่าด้วยsetผลลัพธ์คำสั่ง$SHELLOPTSเป็น การตั้งค่าด้วยshoptผลลัพธ์คำสั่ง$BASHOPTSเป็น


9
ฮึ นั่นยิ่งทำให้สับสนมากขึ้น สมองของฉันต้องการเชื่อมโยงshoptกับ $ SH ELL OPT S มากกว่า $ BA SHOPT S.
Bruno Bronosky


8

ง่าย แต่หายไปในประวัติศาสตร์ คำสั่งเดิมที่ใช้ในการปรับเปลี่ยนสภาพแวดล้อมบรรทัดคำสั่งของเชลล์ยูนิกซ์เดิมset /bin/shจากนั้นเมื่อมีการพัฒนา Unix รุ่นต่างๆและเพิ่มรสชาติของเชลล์ใหม่ผู้คนตระหนักว่าพวกเขาจำเป็นต้องสามารถเปลี่ยนแปลงสิ่งต่าง ๆ (สภาพแวดล้อม) เพื่อให้เชลล์สคริปต์สามารถทำงานร่วมกันได้ ในเวลานั้นทุบตีได้รับความนิยมอย่างมากและต้องการsh ell opt ions shoptเพิ่มเติม

จริงๆคุณสามารถเห็นเหล่านี้compatพยายาม ibility ในshoptคำสั่ง

$ shopt
autocd          off
cdable_vars     off
cdspell         off
checkhash       off
checkjobs       off
checkwinsize    off
cmdhist         on
compat31        off
compat32        off
compat40        off
compat41        off
compat42        off
complete_fullquote      on
direxpand       off
dirspell        off
dotglob         off
execfail        off
expand_aliases  on
extdebug        off
extglob         off
extquote        on
failglob        off
force_fignore   on
globstar        off
globasciiranges off
gnu_errfmt      off
histappend      on
histreedit      off
histverify      off
hostcomplete    on
huponexit       off
interactive_comments    on
lastpipe        off
lithist         off
login_shell     on
mailwarn        off
no_empty_cmd_completion off
nocaseglob      on
nocasematch     off
nullglob        off
progcomp        on
promptvars      on
restricted_shell        off
shift_verbose   off
sourcepath      on
xpg_echo        off

แต่ไม่ใช่ในsetคำสั่ง

$ set -o
allexport       off
braceexpand     on
emacs           on
errexit         off
errtrace        off
functrace       off
hashall         on
histexpand      on
history         on
igncr           off
ignoreeof       off
interactive-comments    on
keyword         off
monitor         on
noclobber       off
noexec          off
noglob          off
nolog           off
notify          off
nounset         off
onecmd          off
physical        off
pipefail        off
posix           off
privileged      off
verbose         off
vi              off
xtrace          off

2
setเนื่องจากวิธีการตั้งค่าตัวเลือกไม่ได้อยู่ในเชลล์ Unix ดั้งเดิมมันถูกนำเสนอโดยบอร์นเชลล์ในช่วงปลายยุค 70 set -o nameตัวเองถูกเพิ่มเข้ามาในภายหลังโดย Korn เชลล์ที่ระบุ แต่เป็นตัวเลือกใน POSIX แต่ยังไม่รองรับโดยเวอร์ชัน Bourne shell "modern"เช่น/bin/shSolaris 10
Stéphane Chazelas

5

จากหนังสือ "Linux Shell Scripting with Bash", p 63:

ในอดีตsetคำสั่งถูกใช้เพื่อเปิดและปิดตัวเลือก เมื่อจำนวนตัวเลือกเพิ่มsetขึ้นทำให้ใช้งานได้ยากขึ้นเนื่องจากตัวเลือกมีรหัสตัวอักษรเดียวแทน ดังนั้น Bash จึงให้คำสั่งshopt( ตัวเลือกเชลล์ ) เพื่อเปิดและปิดตัวเลือกโดยใช้ชื่อแทนตัวอักษร คุณสามารถตั้งค่าตัวเลือกบางอย่างด้วยตัวอักษรเท่านั้น คนอื่น ๆ จะใช้ได้เฉพาะภายใต้shoptคำสั่ง สิ่งนี้ทำให้การค้นหาและการตั้งค่าตัวเลือกเฉพาะเป็นงานที่สับสน


3

ดูเหมือนว่าตัวเลือก "set" นั้นสืบทอดโดย subshells และ shopts ไม่ใช่


รับได้สวย. ฉันสงสัยว่านี่เป็นตัวเลือกโดยเจตนาหรือผลข้างเคียง
Kevin

2
@ user29778 อย่างน้อยภายใต้bash 4.1.5 (1)ตัวเลือกที่กำหนดด้วยsetไม่ได้รับการสืบทอดโดย subshells.Both setและshoptตัวเลือกไม่ได้รับการสืบทอดโดย subshells
Martin

คุณสามารถชี้ไปที่เอกสารที่อธิบายคุณสมบัติการสืบทอดของทั้งสองsetและshopt?
เฟลิเป้อัลวาเรซ

9
ทั้งสองset -oและshoptตัวเลือกจะได้รับมรดกโดย subshells ( (...),, $(...)ส่วนประกอบท่อ) ไม่ว่าพวกเขาจะสืบเชื้อสายมาจากอื่น ๆbashสวดขึ้นอยู่กับว่าSHELLOPTSหรือBASHOPTSอยู่ในสภาพแวดล้อมหรือไม่
Stéphane Chazelas

0

setมีต้นกำเนิดมาจากเปลือก bourne (sh) และเป็นส่วนหนึ่งของมาตรฐาน POSIX shoptอย่างไรก็ตามไม่ใช่และเป็นเฉพาะ bourne-shell shell (bash) เฉพาะ:

0 sjas@ssg 14:31:45 ~  
set | grep -e SHELLOPTS -e BASHOPTS
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:dotglob:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

0 sjas@ssg 14:31:51 ~  
shopt | column -t | grep -v off
checkwinsize             on
cmdhist                  on
complete_fullquote       on
dotglob                  on
expand_aliases           on
extglob                  on
extquote                 on
force_fignore            on
histappend               on
interactive_comments     on
progcomp                 on
promptvars               on
sourcepath               on

0 sjas@ssg 14:31:57 ~  
set -o | column -t | grep -v off
braceexpand           on
emacs                 on
hashall               on
histexpand            on
history               on
interactive-comments  on
monitor               on

0 sjas@ssg 14:37:41 ~ 
sh 

$ set -o
Current option settings
errexit         off
noglob          off
ignoreeof       off
interactive     on
monitor         on
noexec          off
stdin           on
xtrace          off
verbose         off
vi              off
emacs           off
noclobber       off
allexport       off
notify          off
nounset         off
priv            off
nolog           off
debug           off

$ shopt
sh: 3: shopt: not found

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