Bashrc'mde yerel bir işlevi nasıl oluşturabilirim?


40

.Bashrc kodumun tekrarlayan bazı kodları vardı, bu yüzden basitleştirmek için bir fonksiyon kullandım.

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

do_stuff '5.1'
do_stuff '5.2'

Ancak, şimdi kabuğumu kullandığımda "do_stuff" adı kapsamda olduğundan, sekme tamamlayıp bu işlevi çalıştırabilirim (potansiyel olarak ortam değişkenlerimi karıştırıyor). "Do_stuff" ı yalnızca .bashrc içinde görünür yapmanın bir yolu var mı?


2
İhracatı yapmamışsanız, bir deniz kabuğu ()yapmak için de kullanabilirsiniz . Basit vakalar için bir başka olasılık for version in 5.1 5.2, versionkaçmasına izin vermesine rağmen, bir döngü kullanmaktır .
Ciro Santilli,

Yanıtlar:


40

unsetSizin için son satır olarak kullanın .bashrc:

unset -f do_stuff

fonksiyonu siler / çözer do_stuff.

Değişkenleri silmek / çözmek için aşağıdaki gibi çağırın:

unset variablename

Gerçekten buradaki tek yol unset mi? Sanırım,
işlevim

Bu sorun çek Frist ise fonksiyon varsa: if type do_stuff >/dev/null 2>&1; then echo "exists"; else echo "dont"; fi.
kaos

8
do_stuffBaşka bir fonksiyonun içinde kullanılırsa bu işe yaramaz . Bu fonksiyonu çağırdığınızda, alacaksınız bash: do_stuff: command not found. Operasyonun konuştuğu durum bu olmadığını biliyorum ama dikkat çekmeye değer.
Burhan Ali

Güzel ve POSIX .
Ciro Santilli,

15

Diğer seçenek, bu işlevin genel olmasını istemediğinizi belirtmek için diğer komut dizileri gibi alt çizgiler kullanmaktır. _Do_foo yazarak olasılığınız oldukça küçük ve başka biriyle çakışma olasılığı düşük.


1
Evet, özel bir işleve sahip olma niyetini belirtmek için "_" kullanın, ancak bunun çatışmalarla ilgisi yoktur. Herkes "_debug ()" veya "_safe_copy ()" e ihtiyaç duyabilir. Çatışmalardan kaçınmaya yardımcı olan bir şey varsa, bunun alt çizgi ile ilgisi yoktur .
Alois Mahdal

3

Düşünebildiğim tek çözüm, altını çiziyor ve oldukça benzersiz bir isim veriyor, hatta belki de süslü bir dil gibi noktalarla isimlendiriyor ( ama bu işe yaramayacaksh ).

Heck, bunun herhangi bir çatışması olmayacak:

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

0

Bir yorumda önerildiği gibi, bir alt kabuk kullanabilirsiniz:

#!/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,'

Arzu ettiğimiz tek yan etki için ( herebelge kullanarak <<SIDE) alt kabuk standart çıktısına başka bir komut dosyası oluşturuyoruz . Sonra kaynaklanıyoruz ..

'Abime en mise' gücü, shkorkutucu bir mucize kaynağıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.