Функции в bashrc. Ещё одна простая вещь

    В .bashrc можно описывать функции.

    К чему это я? Если вам не хватает alias, не обязательно писать однострочный скрипт.

    Можо в .bashrc добавить, например, функцию для получения внешнего ip адреса

    wanip() {
    wget -q -O - checkip.dyndns.com | awk '{print $6}'| sed 's/<.*>//'
    }

    В командной строке wanip покажет ваш внешний ip адрес.

    А лучше вынести в отдельный файл, для этого в .bashrc добавить

    if [ -f ~/.bash_func ]; then
    . ~/.bash_func
    fi

    .bash_func — имя файла, где и будем писать функции.

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 36

      +12
      «Как много нам открытий чудных
      Сегодня дарит мануал!» ©

      Спасибо, я не задумывался про такую штуку.
        +4
          +3
          BTW, поделюсь функцией для алиаса:

          cd /tmp/some/nonexistent/directory
          Создает поддиректорию в /tmp, и переходит в неё. Причем только для /tmp

          function cd_alias ()
          {
          targetdir=$(readlink -m "$@")
          [[ ${targetdir:0:4} == "/tmp" ]] && [[ ! ( -d "${targetdir}" ) ]] && mkdir -p "${targetdir}"
          cd ${targetdir}
          }
          alias cd="cd_alias "


          И пояснение как это работает.
            0
            Я давненько сделал себе в zsh что-то в это роде:
            md() {
            mkdir $1 && cd $1
            }
            но вот беда, с sudo не работает, не знаете как решить?
              +1
              Сделать внешний скрипт (например, /usr/local/bin/md) либо скопировать эту функцию в zrh root'а.
                0
                мне кажется, с zshrc рута не заработает, потому как sudo -u username md тоже не работает, прийдется делать скрипт, но это как-то не красиво.
                Может есть возможность реализовать через alias?
                  0
                  Через внешнюю программу или скрипт такое реализовать нельзя, т.к. текущий каталог — это свойство каждого процесса. В данном случае каталог сменится только для вызванной программы или интерпретатора скрипта. Ваш же шелл «останется» в том же каталоге, что и до вызова.
                    0
                    Для этого есть eval например:

                    #!/bin/sh
                    function md() {
                    sudo mkdir -p $1 &&
                    cd $1 &&
                    DIR=`pwd` &&
                    eval «cd $DIR»
                    }

                    (Правда не знаю, заработает ли для zsh, я его не использую).
                  0
                  alias sudo='A=`alias` sudo '
                +5
                Внешний IP еще можно посмотреть так:

                $ curl ifconfig.me
                  0
                  А как посмотреть внутренний IP? Тот, что в ifconfig?

                  Хочу сделать скрипт, который покажет при логине имя сервера и его IP.
                    0
                    Распарсить вывод ifconfig. Например, так:

                    ifconfig [interface name] | grep inet | grep -v inet6 | cut -d ":" -f 2 | cut -d " " -f 1

                    В разных *nix-системах формат вывода ifconfig может отличаться, поэтому, возможно, придётся скорректировать скрипт под конкретную модификацию ifconfig.
                      0
                      Благодарю.
                        +1
                        В разных *nix-системах формат вывода ifconfig может отличаться, поэтому, возможно, придётся скорректировать скрипт под конкретную модификацию ifconfig.

                        А можно и так:
                        ip addr show <интерфейс>|grep inet\ |read i j k l m n o;echo $j|sed 's/\/.*$//'
                        net-tools давно устарели, отдельные дистрибутивы уже всерьёз думают о переходе на iproute2.
                        0
                        В linux ifconfig родом из net-tools. А для определения ip на интерфейсе используется из того же пакета команда: hostname -i
                          +4
                          >hostname -i
                          127.0.0.1

                          Нет, оно не врёт, но…
                          0
                          или так:
                          ifconfig eth0|gawk '/inet addr/{print $2}'|gawk -F: '{print $2}'

                          Встречал такое решение:
                          /usr/local/sbin/motd.sh
                          #!/bin/sh
                          IFCONFIG=`which ifconfig 2>/dev/null||echo /sbin/ifconfig`
                          IPADDR=`LANG=en_US.UTF-8 $IFCONFIG eth0|gawk '/inet addr/{print $2}'|gawk -F: '{print $2}'`
                          MSJ_NO_IP_DHCP="If you could not get a DHCP IP address please type setup and select \"Network configuration\" to set up a static IP."

                          echo ""
                          echo "Welcome to Elastix "
                          echo "----------------------------------------------------"
                          echo ""
                          #echo "For access to the Elastix web GUI use this URL"
                          echo "To access your Elastix System, using a separate workstation (PC/MAC/Linux)"
                          echo "Open the Internet Browser using the following URL:"

                          if [ "$IPADDR" = "" ]; then
                          echo "http://<YOUR-IP-HERE>"
                          echo "$MSJ_NO_IP_DHCP"
                          else
                          echo "http://$IPADDR"
                          fi

                          echo ""



                          /etc/rc.local
                          /usr/local/sbin/motd.sh > /etc/motd
                        0
                        Вот еще от меня алиас, вдруг кому пригодится:
                        alias pwget='ssh alex@pasechnik screen -m -d wget -P /srv/samba/share --append-output=/srv/samba/share/pwget.log'
                          0
                          Давно использую, и с иерархией файлов. И удивлен, что не так много людей, знающих тонкости консоли…
                            +2
                            Предчувствую появление ИТТ тролля, который крайне тонко пройдется по поводу тонкостей консоли

                            Крайне полезная штука, я кстати не знал — хотя линь использую со времен 7го редхэта… Shame on me
                              0
                              Ага :)
                              Ну, я в свое время много в удаленке провел, без графики. А тут уже и zsh, и различные скрипты, и обустраивание своего рабочего места. Много читал, многое перепробовал… Дажу систему ронял экспериментами. Для меня консоль — преимущество + независимость/универсальность + необходимость.
                              А тролль может и появиться, правда в этой теме его щедро накормят минусами :)
                            0
                            А чем функция лучше, чем файл со скриптом (кроме отсутствия необходимости создания отдельного файла)?
                              +1
                              На мой вкус отдельный скрипт наоборот лучше тем, что его можно без проблем запускать от имени любого юзера, а также через sudo. А вот с запуском функции из вашего bashrc от другого юзера или через sudo надо ещё как-то заморочиться.
                                0
                                «не обязательно писать скрипт» != «лучше не писать»
                                0
                                wget -q -O — checkip.dyndns.com/ | awk '{print $6}'| sed 's/<.*>//'

                                curl ifconfig.me
                                  –1
                                  Давайте тогда делиться прикольными PS1 :)
                                  export PS1='\[\e[37;42;1m\]\u@\h\[\e[0m\]\[\e[30;1m\] \d $(date +%H:%M:%S%P)\n\[\e[32;1m\]\w/\[\e[0m\]'
                                    –1
                                    Мне вот такой нравится (сразу весь bashrc, так как интерактивный):

                                    # Check for an interactive session
                                    [ -z "$PS1" ] && return

                                    alias ls='ls --color=auto'

                                    PS1='[\u@\h \W]\$ '

                                    bash_prompt() {
                                    local NONE="\[\033[0m\]" # unsets color to term's fg color

                                    # regular colors
                                    local K="\[\033[0;30m\]" # black
                                    local R="\[\033[0;31m\]" # red
                                    local G="\[\033[0;32m\]" # green
                                    local Y="\[\033[0;33m\]" # yellow
                                    local B="\[\033[0;34m\]" # blue
                                    local M="\[\033[0;35m\]" # magenta
                                    local C="\[\033[0;36m\]" # cyan
                                    local W="\[\033[0;37m\]" # white

                                    # emphasized (bolded) colors
                                    local EMK="\[\033[1;30m\]"
                                    local EMR="\[\033[1;31m\]"
                                    local EMG="\[\033[1;32m\]"
                                    local EMY="\[\033[1;33m\]"
                                    local EMB="\[\033[1;34m\]"
                                    local EMM="\[\033[1;35m\]"
                                    local EMC="\[\033[1;36m\]"
                                    local EMW="\[\033[1;37m\]"

                                    # background colors
                                    local BGK="\[\033[40m\]"
                                    local BGR="\[\033[41m\]"
                                    local BGG="\[\033[42m\]"
                                    local BGY="\[\033[43m\]"
                                    local BGB="\[\033[44m\]"
                                    local BGM="\[\033[45m\]"
                                    local BGC="\[\033[46m\]"
                                    local BGW="\[\033[47m\]"

                                    case $TERM in
                                    xterm*|rxvt*)
                                    if [ `echo $SSH_CLIENT | wc -c` -gt 1 ]; then SSH_FLAG=1; fi
                                    if [ `/usr/bin/whoami` = "root" ]; then ROOT_FLAG=1; fi
                                    if ([ "$SSH_FLAG" = 1 ] && [ "$ROOT_FLAG" = 1 ]); then
                                    local TITLEBAR='\[\033]0;[SSH] \u@\h\007\]'
                                    PS1="$TITLEBAR${R}[!] ${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
                                    elif [ "$SSH_FLAG" = 1 ]; then
                                    local TITLEBAR='\[\033]0;[SSH] \u@\h\007\]'
                                    PS1="$TITLEBAR${EMR}[SSH]${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
                                    elif [ "$ROOT_FLAG" = 1 ]; then
                                    local TITLEBAR='\[\033]0;\u@\h\007\]'
                                    PS1="$TITLEBAR${R}[!] ${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
                                    else
                                    local TITLEBAR='\[\033]0;\u@\h\007\]'
                                    PS1="$TITLEBAR${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
                                    fi
                                    ;;
                                    *)
                                    if [ "$SSH_FLAG" = 1 ]; then
                                    PS1="[SSH]$PS1"
                                    fi
                                    if [ `/usr/bin/whoami` = "root" ]; then ROOT_FLAG=1; fi
                                    if [ "$ROOT_FLAG" = 1 ]; then
                                    PS1="$TITLEBAR${R}[!] ${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
                                    else
                                    PS1="$TITLEBAR${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
                                    fi
                                    ;;
                                    esac
                                    }

                                    bash_prompt
                                      –1
                                      Вот как выглядит: image
                                    +1
                                    Мне кажется, у вас опечатка в строчке:

                                    if [ -f~/.bash_func ]; then

                                      +1
                                      … отсутсвует пробел после -f (прошу прощения за разорванный комментарий).
                                        0
                                        Вроде не критично, но поправил, спасибо :)
                                          0
                                          Ну как же не критично: без пробела test(1) воспримет -f не как параметр, а как часть строки; таким образом, условие всегда будет истинным, независимо от наличия файла (т.к. строка всегда не пустая).
                                            –1
                                            нет, воспринимается как параметр. image и vim подсвечивает правильно.

                                            uname -a
                                            Linux comp 3.0.0-rc1 #1 SMP Sun Jun 5 18:17:00 MSD 2011 x86_64 x86_64 x86_64 GNU/Linux

                                            cat /etc/lsb-release
                                            DISTRIB_ID=Ubuntu
                                            DISTRIB_RELEASE=11.04
                                            DISTRIB_CODENAME=natty
                                            DISTRIB_DESCRIPTION="Ubuntu 11.04"

                                              0
                                              Может быть, у вас какая-то странная убунта, но на всех шеллах и операционках, что я встречал, поведение такое:

                                              $ [ -f /etc/passwd ] && echo ok || echo fuck
                                              ok
                                              $ [ -f /fuck/passwd ] && echo ok || echo fuck
                                              fuck
                                              $ [ -f/fuck/passwd ] && echo ok || echo fuck
                                              ok


                                              Как видите, на непустую строку test(1) возвращает true.
                                                0
                                                понял. Спасибо. Ubunt`a нормальная :)
                                                Пробел действительно нужен
                                      0
                                      wanip6() {
                                      wget -q -O — ip6.me/ | head -6 | tail -1 | sed -e :a -e 's/<[^>]*>//g;/</N;//ba'
                                      }

                                      Only users with full accounts can post comments. Log in, please.