ฉันจะยกเลิกการตั้งค่าหรือกำจัดฟังก์ชั่นทุบตีได้อย่างไร


33

หากคุณตั้งค่าหรือส่งออกตัวแปรสภาพแวดล้อมใน bash คุณสามารถยกเลิกการตั้งค่าได้ หากคุณตั้งค่านามแฝงเป็น bash คุณสามารถยกเลิกการตั้งชื่อแทนได้ แต่มีไม่ดูเหมือนจะเป็นunfunction

ลองพิจารณาฟังก์ชั่นทุบตีนี้ (เล็กน้อย) เช่นตั้งค่าในไฟล์. bash_aliasesและอ่านเมื่อเริ่มต้นเชลล์

function foo () { echo "bar" ; }

ฉันจะล้างคำจำกัดความของฟังก์ชั่นนี้จากเชลล์ปัจจุบันได้อย่างไร?
(การเปลี่ยนไฟล์เริ่มต้นหรือการรีสตาร์ทเชลล์จะไม่นับ)


ทุกสิ่งที่ถูกกล่าวunfunctionจะเป็นชื่อที่ดีสำหรับคำสั่ง :-)
Joey

@Johannes Rössel: zshมีมัน
Chris Johnsen

หืมมม ถึงกระนั้นฉันก็พบว่าวิธีการของ PowerShell ในการจัดการกับเรื่องทั้งหมดนี้ง่ายขึ้นและสอดคล้องกันมากขึ้น :-)
Joey

คำตอบ:


50

ล้างในตัวคำสั่งจะใช้เวลาเป็นตัวเลือกที่-fจะฟังก์ชั่นลบ:

unset -f foo

สร้างรายการunsetในbash manpage:

หากระบุ -f แต่ละชื่อจะอ้างถึงฟังก์ชันเชลล์และนิยามฟังก์ชันถูกลบออก

หมายเหตุ: -fจำเป็นจริงๆถ้ามีตัวแปรที่มีชื่อเดียวกันอยู่เท่านั้น หากคุณไม่มีตัวแปรชื่อfooแล้วunset fooจะลบฟังก์ชัน


นั่นคือสิ่งที่ฉันขาดหายไป ฉันต้องการพบ-fพารามิเตอร์ในการส่งออกแต่ยังไม่ได้พบสิ่งนี้ในล้าง ขอบคุณ
ต้มตุ๋น quixote

2
@XavierStuvw: unsetไม่ใช่คำสั่งภายนอกมันเป็นส่วนหนึ่งของเชลล์ ( ทุบตีในกรณีนี้); ลองman bashและค้นหารายการสำหรับunset(การจัดการค่อนข้างใหญ่unsetอยู่ภายใต้Shell Builtin Commandsส่วน)
Chris Johnsen

4

ดูhelp unset:

unset: unset [-f] [-v] [-n] [name ...]

Unset values and attributes of shell variables and functions.

For each NAME, remove the corresponding variable or function.

Options:
  -f    treat each NAME as a shell function
  -v    treat each NAME as a shell variable
  -n    treat each NAME as a name reference and unset the variable itself
    rather than the variable it references

Without options, unset first tries to unset a variable, and if that fails,
tries to unset a function.

Some variables cannot be unset; also see `readonly'.

Exit Status:
Returns success unless an invalid option is given or a NAME is read-only.

มีค่าunset --helpมิได้man unsetโชคร้าย


4
ที่มีอยู่ไม่man unsetได้เพราะมันเป็นตัวในการสั่งการและสำหรับในตัวhelpคำสั่งมีแทน สำหรับคำสั่งในตัวบางอย่างมันก็มีตัวเรียกใช้งานภายนอกเช่นกัน type mycommnadในกรณีที่มีข้อสงสัยลองเช่น ตัวอย่างและมันจะตอบคุณtype unset unset is a shell builtinหากคุณต้องการทราบว่ามีอยู่หรือไม่ให้เรียกใช้งานได้ลองwhich echoอีกครั้ง --option_longเป็นปกติของคำสั่งปฏิบัติการ ลองและecho --help . /bin/echo --help:-)
Hastur

@Hastur รู้สึกอิสระที่จะเพิ่มความคิดเห็นของคุณในคำตอบโดยการแก้ไขหางของมัน หากผู้ตรวจสอบอนุมัติคุณจะได้รับ 2 คะแนน
XavierStuvw

1
... ขอบคุณสำหรับความคิดของซาเวียร์: มันเป็นมากกว่าสำหรับคุณที่จะตอบคำถามให้เสร็จ ผมคิดว่าคุณคิดถึงว่ามันเป็นตัวในการสั่งการและสำหรับพวกเขาที่คุณต้องใช้แทนhelp man(ไม่เป็นความจริงเพราะคุณพบพวกเขาในman bashบทคำสั่งของเชลล์บิลล์หรือโดยตรงกับman BASH-BUILTINS... ) มันสบายที่ภายใต้ bash shell คุณสามารถขอได้helpและคุณจะได้รับรายการคำสั่งใน:-)ตัว (ลองhelp helpและman manเกินไป)
Hastur

1
@Hastur คุณอาจตอบคำถามเพื่อประโยชน์ของผู้อ่านทุกคนได้เป็นอย่างดี จากนั้นเราสามารถลบความคิดเห็นเพื่อสร้างความวุ่นวายให้กับงานพิมพ์ขนาดเล็กได้
XavierStuvw

0

ฉันเพิ่งต้องการถอนการติดตั้งอย่างสมบูรณ์nvmและติดตั้งใหม่และกำจัดสภาพแวดล้อมใด ๆ ปรากฎว่าการกำจัดมันไม่ได้เกิดขึ้นเพราะส่วนมากnvmถูกนำไปใช้เป็นฟังก์ชั่นของเรือที่บรรจุลงในเชลล์ของคุณผ่านทาง.bash_profileหรือ.bashrcหรือทุกที่ที่คุณเพิ่มคำสั่งจัดหาที่มันบอกคุณเมื่อคุณติดตั้งครั้งแรก

ตอนแรกฉันรู้สึกงงงวยโดยwhich nvmไม่ส่งคืนnvmคำสั่งใด ๆ และยังพบว่าคนอื่น ๆ ยังคงพบได้ในที่สุดฉันก็ค้นพบdeclare -Fว่ามันเป็นฟังก์ชั่นของเชลล์ ฉันไม่ต้องการฆ่าเชลล์และเริ่มใหม่ (ด้วยเหตุผลที่ไม่เกี่ยวข้องที่นี่) ดังนั้นฉันจึงลบnvmฟังก์ชันจากเชลล์นั้นด้วย:

for F in `declare -F | grep -e nvm | cut -f 3 -d\ `; do unset -f $F; done

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

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