Как сопоставить другой двоичный файл для той же программы на Linux/Mac?

Собрав и объединив все идеи/предложения, я создал этот скрипт. В разделе заголовка объясняется, как его использовать, и предлагаются новые переключатели. Почти готово:)

#!/bin/bash
# /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# * File       : rexcd.sh
# * Goal       : improve cd linux command
# * Requisites :
# *     1. SHELL=bash
# *     2. Locate service available and up to date. It's necessary to search directories
# *        (see locate, locatedb and updatedb manual for more information)
# * History    :
# *   #version;date;description
# *   0.1.1; 02/05/2018; tested in ubuntu 16.04/bash and minor code improvements
# *   0.1.0; 30/04/2018; first release (tested in cygwin 2.10.x)
# */

#
# How to use
#
# 1. put this script into a directory (Ex: ~/scripts)
#
# 2. insert this code in your ~/.bashrc:
#. ~/scripts/rexcd.sh
#
# 3. open a new shell session and test it:
# cd ~
# rexcd scripts
#
# 4. Example of output (cygwin 2.10.x)
# Choose one directory
# 
# 1) /home/prpe/scripts
# 2) /home/prpe/sintaxe/scripts_plone
# 3) /home/prpe/sintaxe/scripts_plone/scripts
# 4) /usr/share/doc/xorg-scripts-1.0.1
# 5) /usr/x86_64-pc-cygwin/lib/ldscripts
# Option [1] 2
# 
#  
# prpe@DESK-00-090117 ~/sintaxe/scripts_plone
# $

#
# ToDo:
#
# 1. switch:-i (ignore case)
# 2. switch:-l limits of directories in menu (from m-th to n-th search matches)  (m,n|m,|,n default 1 to number of matches)
# 3. switch:-d root directory -d <dir> (default /)
# 4. switch:-u perform an update of locatedb table
#

# syntax: rexcd_exit <msg>
function rexcd_exit {
    local msg=$1
    echo "${msg}" >&2
    return 1
}

# syntax: 
#  export rexcd_opt=""
#  rexcd_menu opt1 opt2... optn
#  echo $rexcd_opt
function rexcd_menu {
    # return code + option
    local FN_RESULT=1
    rexcd_opt=""

    # variáveis de controle
    local num_options=$#
    local arr_options
    local num_choose=1
    local FN_DEFAULT=""
    local v_aux1 v_aux2
    local fl ind

    # menu message
    local FN_MSG="Choose one directory "
    local PS3="#"

    # checking number of options and creating list of them
    if [ $num_options -lt 2 ]; then
        rexcd_exit "At least 2 options required"
        return $?
    fi

    let ind=1
    for fl in $*; do
        arr_options[${ind}]="${fl}"
        let ind++
    done

    # menu
    FN_RESULT=1
    ind=1
    num_choose=""
    FN_DEFAULT=$ind
    PS3="Option [${FN_DEFAULT}] "

    echo "" ; echo "${FN_MSG}" ; echo ""
    select num_choose in `echo ${arr_options[@]}`; do
        case "${num_choose}" in
            *)
                if [ -z "${num_choose}" ]; then
                    read -t 2 -p "Invalid option"
                    echo "" ; echo "${FN_MSG}" ; echo ""
                    continue
                fi
                FN_RESULT=0
                break
                ;;
        esac
    done
    echo ""

    rexcd_opt="${num_choose}"
    return ${FN_RESULT}
}

function rexcd {
    local contador fl
    local padrao=""
    local max_opc=15
    local lst_opc=""
    local retorno=0
    local v_aux=0

    # its necessary declare as export
    export rexcd_opt=""

    if [ $# -ne 1 ]; then
        rexcd_exit "Number of arguments invalid: $#. Must be exactly one."
        return $?
    fi

    padrao=$1
    contador=0
    cd /
    for fl in `locate -i "${padrao}"`; do
        # filter not directories elements
        [ ! -d "${fl}" ] && continue

        # search regards
        basename "${fl}" | grep -q -i "${padrao}"
        [ $? -ne 0 ] && continue


        # update array e var count
        let v_aux=contador+1

        if [ $contador -eq 1 ]; then
            lst_opc="${fl}"
        else
            lst_opc="${lst_opc} ${fl}"
        fi

        let contador++
        # verifica o máximo de entrada
        if [ $contador -ge $max_opc ]; then
            echo "WARNING: Maximum number of options $max_opc reached" >&2
            break
        fi
    done

    if [ ${contador} -eq 1 ]; then
        rexcd_opt="${lst_opc}"
    elif [ ${contador} -gt 1 ]; then
        export rexcd_opt=""
        rexcd_menu ${lst_opc}
        retorno=$?
    else
        rexcd_exit "No directory matches with ${padrao}."
        retorno=$?
    fi

    [ $retorno -eq 0 ] && cd ${rexcd_opt}
    return ${retorno}
}
0
09.04.2020, 12:29
1 ответ

У вас есть несколько вариантов.

  • Измените переменную PATH, чтобы она искала каталоги в другом порядке. Это повлияет на все программы в этих каталогах.
  • В Debian используйте альтернативы Debian (Debian и его производные ). И только иногда полезно.
  • Настройте каталог /opt/bin-override, добавьте его в заголовок PATHи добавьте символические ссылки команд, которые вы хотите запустить.
  • Добавьте псевдонимы к вашему ~/.bash_aliasesили /etc/bash.bashrc, например.
    alias R="/some/other/location/R"
1
28.04.2021, 23:18

Теги

Похожие вопросы