ฉันจะแสดงรายการตัวเลือก bash'es สำหรับเชลล์ปัจจุบันได้อย่างไร


27

ตัวบุกรุก bash นั้นมีตัวเลือกเช่น

บรรทัดที่ 22-23 ของหน้า man ของ bash:

OPTIONS  
All of the  single-character shell options documented in the description of the set builtin command can be used as options when the shell is invoked.   In addition, bash interprets the following options when it is invoked:  
-c ...  
-i ...  
-l ...  
-r ...  

ฉันใช้รูปแบบการค้นหาเล็กน้อยในหน้า bash man เช่น:

  • /^\s*set
  • /list

เป็นไปได้ไหมที่จะพิมพ์รายการการตั้งค่าเหล่านี้ที่ใช้กับเชลล์ปัจจุบัน?

คำตอบ:


26
printf %s\\n "$-"

จะแสดงรายการตัวเลือกตัวอักษรเดียวในสายเดียว

พารามิเตอร์นั้นยังสามารถใช้เช่น:

set -f -- ${-:+"-$-"}
echo *don\'t* *glob* *this*
set +f "$@"

เปลือกปิดการใช้งานครั้งแรกของ-fการขยายตัว ilename พร้อมกันในขณะที่ประหยัดค่า$-- ถ้าใด ๆ - $1ใน ถัดไปจะไม่มี globs เกิดขึ้นและนามสกุล+filename จะเปิดใช้งานอีกครั้งและอาจถูกปิดใช้งานด้วย

ตัวอย่างเช่นหาก-fการขยาย ilename ถูกปิดใช้งานอยู่แล้วเมื่อค่าสำหรับ$-บันทึกครั้งแรกค่าที่บันทึกไว้จะเป็น(อย่างน้อย) :

f

และเมื่อsetมีการเรียกใช้อีกครั้งจะได้ผลเป็น:

set +f -f

ซึ่งเพิ่งจะทำให้คุณกลับมาทันทีที่คุณเริ่ม

set +o

จะแสดงรายการsetตัวเลือกตารางเชลล์ทั้งหมด(ดูคำตอบของ Jasonสำหรับความshoptสามารถ - คือคำหรือไม่ - ตัวเลือก)ในรูปแบบที่ปลอดภัยสำหรับการย้อนเข้าสู่เชลล์ ด้วยวิธีนี้คุณสามารถทำสิ่งต่อไปนี้

state=$(set +o)
set -some -crazy -options
eval "$state"

หากต้องการบันทึกเปลี่ยนแปลงและกู้คืนสถานะเชลล์ตัวเลือกตามลำดับ

ในการจัดการshoptไอออนและsetตัวเลือกตารางในครั้งเดียว:

state=$(set +o;shopt)
#do what you want with options here
eval "$state"

นอกจากนี้คุณยังสามารถโทรset โดยไม่มีข้อโต้แย้งใด ๆ เพื่อเพิ่มรายการตัวแปรที่ตั้งค่าไว้ทั้งหมดของเชลล์ในขณะนี้ และคุณสามารถ - ใน bash - เพิ่มคำสั่งtypeset -fpเพื่อรวมฟังก์ชันของเชลล์ที่ประกาศไว้ทั้งหมดในปัจจุบัน คุณสามารถรวมมันเข้าด้วยกันและevalเมื่อพร้อม คุณยังสามารถโทรได้aliasโดยไม่มีข้อโต้แย้งในเรื่องเดียวกัน ที่ ... อาจครอบคลุมถึงแม้ว่า ผมคิดว่ามี"$@"- ซึ่งคุณจะต้องใส่ในอาร์เรย์แรกผมคิดว่าก่อนที่จะทำbashset

Nope trapนอกจากนี้ยังมี คนนี้ตลกเล็กน้อย ปกติ:

trap 'echo this is my trap' 0
(echo this is my subshell; trap)

... เพียงแค่จะพิมพ์นี้เป็น subshell ของฉันเพราะ subshell เป็นกระบวนการใหม่และได้รับชุดของตัวเองtraps - และอื่น ๆ ไม่ได้รับมรดกใด ๆtraps แต่ผู้ที่แม่ของมันได้อย่างชัดเจนไม่สนใจ - (ชอบtrap '' INT )

อย่างไรก็ตาม:

trap 'echo this is my trap' 0
save_traps=$(trap)

trapทำตัวเป็นพิเศษเมื่อมันเป็นคำสั่งแรกและที่เดียวที่รันใน subshell การแทนที่คำสั่งโดยจะทำซ้ำรายการของพาเรนต์เชลล์ที่ตั้งค่าtrapsในปัจจุบันในรูปแบบซึ่งอ้างถึงเพื่อความปลอดภัยในการย้อนกลับไปยังเชลล์ และเพื่อให้คุณสามารถทำsave_traps, แล้ว setโดยไม่ขัดแย้ง - และทุกส่วนที่เหลือที่กล่าวมาแล้ว - จะสวยมากได้รับล็อคในทุกรัฐเปลือก คุณอาจต้องการเพิ่มexport -pและreadonly -pเรียกคืนแอ็ตทริบิวต์ var var ดั้งเดิมอย่างชัดเจน

อย่างไรก็ตามนั่นก็เพียงพอแล้ว


ขอบคุณรหัสของคุณทำงานได้ดี เพื่อรับรายการตัวเลือกทั้งหมดคุณจะต้องใช้ทั้งสองset +o และ shopt ? (เพื่อให้shoptสามารถเป็นคำที่settableใช้ในหน้าคนshoptableทำงานเพื่อฉัน)
the_velour_fog

@ user4668401 - ฉันคิดว่าจะทำ
mikeserv

TL; DR แต่ +1000 สำหรับโซลูชัน 3 บรรทัดเพื่อเปลี่ยนตัวเลือกและนำกลับมาใช้ใหม่ตามเดิม นั่นคือสิ่งที่เราต้องการเมื่อสร้างสคริปต์หรือคัดลอก / วางคำสั่ง
Balmipour

@mikeserv ดูเหมือนว่าจะต้องเพิ่มตัวเลือก-pเมื่อบันทึกสถานะเพื่อรวมshoptไอออนเช่นstate=$(set +o;shopt -p)
nkatsar

9

จากmanหน้า:

shopt
... เมื่อไม่มีตัวเลือกหรือด้วยตัวเลือก -p รายการของตัวเลือกที่ตั้งค่าได้ทั้งหมดจะปรากฏขึ้นโดยมีการระบุว่ามีการตั้งค่าแต่ละตัวหรือไม่
shopt | grep on

จะพิมพ์รายการตัวเลือกที่เปิดใช้งานทั้งหมด


ที่ได้ผลขอบคุณ คุณคุณจะรู้ว่ารายการนี้ตัวเลือกที่มีตัวอย่างไฟล์โดยทั้งสองsetและshopt?
the_velour_fog

@ user4668401 ไม่มีsetอยู่ไกลอย่างกว้างขวางมากขึ้น: ดูรายการหน้าคน
jasonwryan

และการตรวจสอบว่าเป็นตัวเลือกเดียวคือเมื่อ:shopt <option>
คอส

ซึ่งจะรวมถึงตัวเลือกที่มี "เปิด" ในชื่อ (เช่นhuponexit) วิธีง่ายๆในการแก้ไขคือshopt | grep on$
Mike D

6

ในการแสดงรายการตัวเลือกทั้งหมด:

set -o

วิธีตรวจสอบตัวเลือกเฉพาะ:

set -o | grep <OPTION>

ใช้ตัวเลือกverboseเป็นตัวอย่าง:

$ set -o | grep verbose
verbose         off

6

ตัวเลือก?: มีสามกลุ่มตัวเลือกในทุบตี

  1. setตัวเลือกอ่านหรือกำหนดโดยคำสั่ง
    (ใช้คำสั่งนี้สำหรับคู่มือการใช้งาน: LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash)
    ทุกตัวเลือกหนึ่งตัวอักษร:abefhkmnptuvxBCEHPT

    ตัวเลือก (ซึ่งไม่มีตัวอักษรเดียวที่เทียบเท่า):

    set -o emacs
    set -o history
    set -o ignoreeof
    set -o interactive-comments
    set -o pipefail
    set -o posix
    set -o vi
  2. shoptตัวเลือกอ่านหรือกำหนดโดยคำสั่ง
    (อ่านคู่มือด้วยคำสั่งนี้LESS=+/'shopt \[-pqsu\]' man bash')
    รายการที่ค่อนข้างยาว แต่ง่ายต่อการพิมพ์ใช้:

    $ shopt -p

    หรือคล้ายกัน (แต่ไม่เท่ากัน):

    $ shopt
  3. ตัวเลือกที่อาจจะตั้งอยู่บนภาวนา:
    (คำสั่งสำหรับคู่มือการใช้งาน: LESS=+/'^INVOCATION' man bash)

    setตัวเลือกทั้งหมด:

    bash -abefhkmnptuvxBCEHPT

    shoptตัวเลือกทั้งหมด

    bash -O option

    ตัวเลือกบางอย่างที่มีความหมายเฉพาะเมื่อมีการโจมตีทุบตี:

    bash -lirsDc

    และยัง (ตัวเลือกยาว):

    bash --debugger --help --init-file file --rcfile file --login \
         --noediting --noprofile --norc --posix --restricted \
         --verbose --version

ทุกsetหนึ่งตัวเลือกตัวอักษรและจะพิมพ์ด้วย-ri$-

-i      Interactive  
Only read with `$-` (if it contains an `i`).
-r      Restricted
Also read with `shopt -p restricted_shell

ตัวอย่างเช่น:

$ echo 'echo $0 $-' | bash -abefhikmprtuvxBCEHPT -lri

การเรียก bash เป็นเชลล์ล็อกอินจะถูกรายงานด้วย shopt เท่านั้น:

-l      Login
read with `shopt -p login_shell`

ดังนั้น:

$ echo 'shopt -p login_shell' | bash -abefhikmprtuvxBCEHPT -lri
shopt -s login_shell

ตัวเลือก-nไม่สามารถทดสอบได้โดยรหัสใด ๆ เนื่องจากมันหมายถึง: อย่าเรียกใช้งานรหัสใด ๆ


ตัวเลือกการพิมพ์

เครื่องมือที่ดีที่สุดที่จะแสดงรายการตัวเลือกของการทำงานเปลือกทั้งคนที่ตั้งด้วยsetหรือคนที่กำหนดด้วยเหมือนกันshopt shoptในการแสดงรายการตัวเลือกการตั้งค่า:

shopt -o

set -oซึ่งทำหน้าที่ตรงตามที่ ใช้เพื่อให้ได้ผลเช่นเดียวกับshopt -poset +o

ในการแสดงรายการตัวเลือก Shopt:

shopt -p

ซึ่งคุณสามารถเลือกพิมพ์ทั้งชุดที่กำหนดshopt -psหรือไม่ได้ตั้งค่าได้shopt -pu

เพื่อรับตัวเลือกทั้งหมด มากที่สุดเท่าที่เป็นไปได้มีตัวเลือกมากมายและบางส่วน ( -sDc) บน INVOCATION ไม่สามารถพิมพ์ได้:

$ echo $-; shopt -p ; shopt -po

ในการจัดเก็บไว้ในตัวแปร:

$ storeoptions="$(echo "set -$-"; shopt -p ; shopt -po)"

และตัวแปรสามารถใช้เพื่อตั้งค่าตัวเลือกทั้งหมด:

$ eval "$storeoptions"

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