ฉันจะสร้างฟังก์ชั่นท้องถิ่นใน bashrc ของฉันได้อย่างไร


40

. bashrc ของฉันมีรหัสบางส่วนที่ซ้ำซ้อนดังนั้นฉันจึงใช้ฟังก์ชั่นเพื่อทำให้มันง่ายขึ้น

do_stuff() {
  local version=$1
  export FOO_${version}_X="17"
  export FOO_${version}_Y="42"
}

do_stuff '5.1'
do_stuff '5.2'

อย่างไรก็ตามตอนนี้เมื่อฉันใช้เชลล์ชื่อ "do_stuff" อยู่ในขอบเขตดังนั้นฉันจึงสามารถแท็บเติมและเรียกใช้ฟังก์ชันนั้น (อาจทำให้ตัวแปรสภาพแวดล้อมของฉันสับสน) มีวิธีทำให้ "do_stuff" มองเห็นได้เฉพาะภายใน. bashrc หรือไม่


2
หากคุณไม่ต้องการส่งออกคุณสามารถใช้()เพื่อสร้าง subshell ได้ ความเป็นไปได้สำหรับกรณีที่เรียบง่ายก็คือการใช้for version in 5.1 5.2ห่วงถึงแม้นี่จะช่วยให้versionหลบหนี
Ciro Santilli 新疆改造中心法轮功六四事件

คำตอบ:


40

ใช้unsetเป็นบรรทัดสุดท้ายใน.bashrc:

unset -f do_stuff

จะลบ / do_stuffล้างค่าฟังก์ชั่น

หากต้องการลบ / ยกเลิกการตั้งค่าตัวแปรจะเรียกใช้ดังนี้:

unset variablename

ไม่ได้ตั้งค่าวิธีเดียวที่นี่จริงเหรอ? ฉันเดาว่าถ้าฉันใช้ชื่อที่ยาวและน่าเกลียดสำหรับฟังก์ชั่นของฉันโอกาสที่มันจะกระทบกับสิ่งอื่นจะไม่ใช่เรื่องใหญ่เลย ...
hugomg

ถ้านั่นเป็นปัญหาให้ตรวจสอบก่อนว่ามีฟังก์ชันอยู่if type do_stuff >/dev/null 2>&1; then echo "exists"; else echo "dont"; fiหรือไม่
ความโกลาหล

8
สิ่งนี้จะไม่ทำงานหากdo_stuffใช้ภายในฟังก์ชั่นอื่น bash: do_stuff: command not foundเมื่อคุณเรียกใช้ฟังก์ชั่นที่คุณจะได้รับ ฉันรู้ว่านี่ไม่ใช่กรณีที่ op พูดถึง แต่มันก็คุ้มค่าที่จะชี้ให้เห็น
Burhan Ali


15

ตัวเลือกอื่นคือใช้ขีดล่างเช่นในภาษาสคริปต์อื่น ๆ เพื่อระบุว่าคุณไม่ต้องการให้ฟังก์ชั่นนี้เป็นแบบสาธารณะ โอกาสที่คุณจะพิมพ์ _do_foo นั้นค่อนข้างเล็กและไม่น่าจะขัดแย้งกับคนอื่น


1
ใช่ใช้ "_" เพื่อระบุความตั้งใจที่จะมีฟังก์ชั่นส่วนตัว แต่สิ่งนี้ไม่เกี่ยวข้องกับความขัดแย้ง ทุกคนสามารถต้องการ "_debug ()" หรือ "_safe_copy ()" หากมีบางสิ่งที่ช่วยหลีกเลี่ยงความขัดแย้งก็ไม่มีอะไรเกี่ยวข้องกับขีดเส้นใต้
Alois Mahdal

3

ทางออกเดียวที่ฉันสามารถคิดเป็นขีดมันและให้มันเป็นชื่อที่ไม่ซ้ำสวยแม้กระทั่ง namespacing มันมีจุดเหมือนภาษา fancypants ( แต่นี้จะไม่ทำงานใน Ye Oldesh )

Heck สิ่งนี้จะไม่มีข้อขัดแย้งใด ๆ :

_my_foobar_method_91a3b52d990f4a9f9d5d9423ec37b64c () {
    # Custom proprietary logic protected ID 10 T intellectual property copyright clauses.
    cat <<< `echo $(xargs printf <<< "$1")`; }
}

0

ตามที่แนะนำในความคิดเห็นคุณอาจใช้ subshell:

#!/bin/bash

. <(
  do_stuff() {
    local version="$1" valid='^\w+$'

    [[ "$version" =~ $valid ]] &&
      cat <<SIDE               || echo "$FUNCNAME: invalid '$version'" >&2
export FOO_${version}_X=17
export FOO_${version}_Y=42
SIDE
  }

  do_stuff 5.0 # FOO_5.0_X is "not a valid identifier"
  do_stuff 5_1
  do_stuff 5_2
)

do_keep() { :; } # just get sure the report below actually works

set | egrep '(do_|FOO_)' |  sed -e 's,^,set:\x09,'

เราสร้างสคริปต์อื่นในเอาต์พุตมาตรฐานเชลล์ย่อยสำหรับผลข้างเคียงเดียวที่เราต้องการ (ใช้hereเอกสาร<<SIDE) .จากนั้นเราจะมีแหล่งที่มา

พลังของ 'mise en abime' in shเป็นแหล่งที่มาของความประหลาดใจที่น่ากลัว

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