GNU/Linux >> Znalost Linux >  >> Linux

Úvod do nástroje goto shell pro Linux

Obslužný program goto shell umožňuje uživatelům přejít do aliasovaných adresářů a také podporuje automatické dokončování.

Jak to funguje

Než budete moci používat goto, musíte si zaregistrovat aliasy adresáře. Například:

goto -r dev /home/iridakos/development 

pak přejděte do tohoto adresáře, např.:

goto dev 

Automatické dokončování v goto

přejděte na přichází s pěkným skriptem pro automatické dokončování – kdykoli stisknete klávesu Tab po goo Bash nebo Zsh vás vyzve s návrhy aliasů, které jsou k dispozici:

$ goto 
bc /etc/bash_completion.d                    
dev /home/iridakos/development
rubies /home/iridakos/.rvm/rubies

Instalace goto

Existuje několik způsobů, jak nainstalovat goto.

Prostřednictvím skriptu

Naklonujte úložiště a spusťte instalační skript jako superuživatel nebo root:

klon git https://github.com/iridakos/goto.git
cd goto
sudo ./install

Ručně

Zkopírujte soubor goto.sh někde ve vašem souborovém systému a přidejte řádek do vašeho .zshrc nebo .bashrc k jeho zdroji.

Pokud jste například umístili soubor do své domovské složky, vše, co musíte udělat, je přidat následující řádek do souboru .zshrc nebo .bashrc soubor:

source ~/goto.sh 

MacOS Homebrew

Vzorec s názvem goto je k dispozici pro prostředí Bash v systému MacOS:

brew install goto 

Přidat barevný výstup

echo -e "\$include /etc/inputrc\nset colored-completion-prefix on" >> ~/.inputrc 

Poznámky:

  • Po instalaci musíte restartovat prostředí.
  • Musíte mít povolenou funkci dokončování Bash pro Bash v MacOS (viz tento problém).
    • Můžete jej nainstalovat pomocí brew install bash-completion pokud ji nemáte povolenou.

Způsoby použití goto

Změnit na adresář s aliasem

Chcete-li přejít na adresář s aliasem, zadejte:

goto <alias> 

Například:

goto dev 

Zaregistrujte si alias

Chcete-li zaregistrovat alias adresáře, zadejte:

goto -r <alias> <directory> 

nebo

goto --register <alias> <directory> 

Například:

goto -r blog /mnt/external/projects/html/blog 

nebo

goto --register blog /mnt/external/projects/html/blog 

Poznámky:

  • goo rozbalí adresářů, takže můžete snadno vytvořit alias vašeho aktuálního adresáře pomocí následujícího příkazu a automaticky bude přiřazen k celé cestě:
    goto -r last_release . 
  • Stisknutím klávesy Tab za názvem aliasu získáte návrhy výchozího adresáře shellu.

Zrušení registrace aliasu

Chcete-li zrušit registraci aliasu, použijte:

goto -u <alias> 

nebo

goto --unregister <alias> 

Například:

goto -u last_release 

nebo

goto --unregister last_release 

Poznámka: Stisknutím klávesy Tab po příkazu (-u nebo --zrušte registraci ), dokončovací skript vás vyzve k zobrazení seznamu registrovaných aliasů.

Vypsat aliasy

Chcete-li získat seznam aktuálně registrovaných aliasů, použijte:

goto -l 

nebo

goto --list 

Rozbalte alias

Chcete-li rozšířit alias na jeho hodnotu, použijte:

goto -x <alias> 

nebo

goto --expand <alias> 

Například:

goto -x last_release 

nebo

goto --expand last_release 

Vyčištění aliasů

Chcete-li vyčistit aliasy z adresářů, které již nejsou přístupné ve vašem souborovém systému, použijte:

goto -c 

nebo

goto --cleanup 

Získat nápovědu

Chcete-li zobrazit informace nápovědy nástroje, použijte:

goto -h 

nebo

goto --help 

Zkontrolujte verzi

Chcete-li zobrazit verzi nástroje, použijte:

goto -v 

nebo

goto --version 

Před změnou adresářů stisknout

Chcete-li před změnou adresářů přesunout aktuální adresář do zásobníku adresářů, zadejte:

goto -p <alias> 

nebo

goto --push <alias> 

Vrátit se do dodaného adresáře

Chcete-li se vrátit do předávaného adresáře, zadejte:

goto -o 

nebo

goto --pop 

Poznámka: Tento příkaz je ekvivalentní příkazu popd ale v rámci goto příkaz.

Odstraňování problémů

Pokud se zobrazí chyba příkaz nebyl nalezen:compdef v Zsh to znamená, že musíte načíst bashcompinit . Chcete-li tak učinit, připojte toto ke svému .zshrc soubor:

automatické načtení bashcompinit
bashcompinit

Zapojte se

Nástroj goto je open source za podmínek licence MIT a příspěvky jsou vítány. Chcete-li se dozvědět více, navštivte sekci Přispívání v úložišti GitHub goto.

Skript goto

goto()
{
  místní cíl
  _goto_resolve_db

  if [ -z "$1" ]; potom
    # zobrazení použití a ukončení, když nejsou žádné argumenty
    _goto_usage
    return
  fi

  subcommand="$1"
  shift
case "$subcommand" v
    -c|--cleanup)
      _goto_cleanup "$@"
     ;;
    -r|--register) # Zaregistrujte si alias
      _goto_register_alias "$@"
     ;;
    -u|--unregister) # Zrušit registraci aliasu
      _goto_unregister_alias "$@"
     ; ;
      _goto_directory_push "$@"
     ;;
    -o|--pop) # Vytáhněte horní adresář z pushd stack, pak změňte tento adresář
      _goto_directory_pop
     ;;
    -l|--list)
      _goto_list_aliases
     ;;
   ) -x|-- a # Rozbalte alias
      _goto_expand_alias "$@"
     ;;
    -h|--help)
      _goto_usage
     ;;
    -v|-- verze)
      _goto_version
     ;;
    *)
      _ goto_directory "$subcommand"
     ;;
  esac
  vrátit $?
}

_goto_resolve_db()
{
  GOTO_DB="${GOTO_DB:-$HOME/.goto}"
  dotkněte se -a "$GOTO_DB"
}

_goto_usage()
{
  kočka <<\USAGE
použití:goto [] []

výchozí použití:
  goto - změny adresáře registrovaného pro daný alias

MOŽNOSTI:
  -r, --register:registruje alias
    goto -r|--register
  -u , --unregister:zruší registraci aliasu
    goto -u|--unregister
  -p, --push:vloží aktuální adresář do zásobníku a poté provede goto
    goto - p|--push
  -o, --pop:vybere horní adresář ze zásobníku a poté se přepne do tohoto adresáře
    goto -o|--pop
  -l, --list:vypíše aliasy
    goto -l|--list
  -x, --expand:rozbalí alias
    goto -x|--expand
  - c, --cleanup:vyčistí neexistující adresář aliasy
    goto -c|--cleanup
  -h, --help:vypíše tuto nápovědu
    goto -h|--help
  -v, --version:zobrazí verze goto skriptu
    goto -v|--version
POUŽITÍ
}

# Zobrazí verzi
_goto_version()
{
  echo "goto verze 1.2.4.1"
}

# Rozbalí adresář.
# Užitečné pro ~, ., .. cesty
_goto_expand_directory()
{
  vestavěné cd "$1" 2>/dev/null &&pwd
}

# Vypíše registrované aliasy.
_goto_list_aliases()
{
  local IFS=$' '
  if [ -f "$GOTO_DB" ]; potom
    při čtení -r název adresáře; do
      printf '\e[1;36m%20s  \e[0m%s\n' "$name" "$adresář"
    hotovo <"$GOTO_DB"
  else
    echo "Ještě jste nenakonfigurovali žádné aliasy adresáře."
  fi
}

# Rozbalí registrovaný alias.
_goto_expand_alias()
{
  if [ "$#" -ne "1" ]; then
    _goto_error "usage:goto -x|--expand "
    return
  fi

  místní vyřešeno

  vyřešeno=$(_goto_find_alias_directory "$1")
  if [ -z "$vyřešeno" ]; potom
    _goto_error "alias '$1' neexistuje"
    return
  fi

  echo "$resolved"
}

# Zobrazí duplicitní aliasy adresáře
_goto_find_duplicate()
{
  local duplicates=

  duplicates=$(sed -n 's:[^ ]* '"$1 "'$:&:p' "$GOTO_DB" 2>/dev/null)
  echo "$duplicates"
}

# Registry a alias.
_goto_register_alias()
{
  if [ "$#" -ne "2" ]; then
    _goto_error "usage:goto -r|--register "
    return 1
  fi

  if ! [[ $1 =~ ^[[:alnum:]]+[a-zA-Z0-9_-]*$ ]]; potom
    _goto_error "neplatný alias – může začínat písmeny nebo číslicemi, po nichž následují písmena, číslice, pomlčky nebo podtržítka"
    return 1
  fi

  místní vyřešeno
  resolved=$(_goto_find_alias_directory "$1")

  if [ -n "$resolved" ]; potom
    _goto_error "alias '$1' existuje"
    return 1
  fi

  místní adresář
  directory=$(_goto_expand_directory "$2")
  if [ -z "$adresář" ]; potom
    _goto_error "nepodařilo se zaregistrovat '$1' do '$2' - nelze cd do adresáře"
    vrátit 1
  fi

  místní duplikát
duplicate=$(_goto_find_duplicate "$adresář")
  if [ -n "$duplicate" ]; then
    _goto_warning "nalezeny duplicitní alias(y):\\n$duplicate"
  fi

  # Připojit záznam k souboru.
  echo "$1 $adresář">> "$GOTO_DB"
  echo "Alias ​​'$1' byl úspěšně zaregistrován."
}

# Zruší registraci daného aliasu.
_goto_unregister_alias()
{
  if [ "$#" -ne "1" ]; then
    _goto_error "usage:goto -u|--unregister "
    return 1
  fi

  local resolved
  resolved=$(_goto_find_alias_directory "$1")
  if [ -z "$vyřešeno" ]; then
    _goto_error "alias '$1' neexistuje"
    return 1
  fi

  # shellcheck disable=SC2034
  local readonly GOTO_DB_TMP="$HOME /.goto_"
  # Smazat záznam ze souboru.
  sed "/^$1 /d" "$GOTO_DB"> "$GOTO_DB_TMP" &&mv "$GOTO_DB_TMP" "$GOTO_DB"
  echo "Alias ​​'$1' byl úspěšně zrušen."
}

# Vloží aktuální adresář do zásobníku a poté přejde na
_goto_directory_push()
{
  pokud [ "$#" -ne "1" ]; then
    _goto_error "usage:goto -p|--push "
    return
  fi

  { pushd . || vrátit se; } 1>/dev/null 2>&1

  _goto_directory "$@"
}

# Vybere horní adresář ze zásobníku a poté přejde
_goto_directory_pop()
{
  { popd || vrátit se; } 1>/dev/null 2>&1
}

# Zruší registraci aliasů, jejichž adresáře již neexistují.
_goto_cleanup()
{
  if ! [ -f "$GOTO_DB" ]; potom
    return
  fi

  while IFS=read -r i &&[ -n "$i" ]; do
    echo "Uklízení:$i"
    _goto_unregister_alias "$i"
  hotovo <<<"$(awk '{al=$1; $1=""; dir=substr($0 ,2);
                    system("[ ! -d \"" dir "\" ] &&echo " al)}' "$GOTO_DB")"
}

# Změny v adresáři daného aliasu
_goto_directory()
{
  local target

  target=$(_goto_resolve_alias "$1") || return 1

  vestavěné cd "$target" 2> /dev/null || \
    { _goto_error "Nepodařilo se přejít na '$target'" &&return 1; }
}

# Načte adresář aliasů.
_goto_find_alias_directory()
{
  místní vyřešeno

  vyřešeno=$( sed -n "s/^$1 \\(.*\\)/\\1/p" "$GOTO_DB" 2>/dev/null)
  echo "$resolved"
}

# Zobrazí danou chybu.
# Používá se pro výstup běžné chyby.
_goto_error()
{
  (>&2 echo -e "goto error:$1 ")
}

# Zobrazí dané varování.
# Používá se pro výstup běžného varování.
_goto_warning()
{
  (> &2 echo -e "goto warning:$1")
}

# Zobrazí položky s aliasy začínajícími na daný.
_goto_print_similar()
{
  místní podobné

  podobné=$(sed -n "/^$1[^ ]* .*/p" "$GOTO_DB" 2>/dev/null)
  if [ -n "$similar" ]; potom
    (>&2 echo "Měli jste na mysli:")
    (>&2 sloupec -t <<<"$similar")
  fi
}

# Načte alias adresář, chyby, pokud neexistuje.
_goto_resolve_alias()
{
  lokálně vyřešeno

  resolved=$(_goto_find_alias_directory "$1")

  if [ -z "$vyřešeno" ]; potom
    _goto_error "unregistered alias $1"
    _goto_print_similar "$1"
    vrátit 1
  else
    echo "${resolved}"
  fi
}

# Dokončí funkci goto dostupnými příkazy
_complete_goto_commands()
{
  local IFS=$' \t\n'

  # shellcheck disable=SC2207
  COMPREPLY=($(compgen -W "-r --register -u --unregister -p --push -o --pop -l --list -x --expand -c --cleanup -v --version" -- "$1"))
}

# Dokončí funkci goto s dostupnými aliasy
_complete_goto_aliases()
{
  local IFS=$'\n' odpovídá
  _goto_resolve_db

  # shellcheck disable=SC2207
  odpovídá=($(sed -n "/^$1/) p" "$GOTO_DB" 2>/dev/null))

  if [ "${#matches[@]}" -eq "1" ]; potom
    # odeberte atribut názvů souborů z metody dokončení
    compopt +o názvy souborů 2>/dev/null

    # pokud najdete pouze jeden alias, nepřipojujte adresář
    COMPREPLY=("${matches[0]// *}")
  else
    pro i v "${!matches[@]}"; do
      # odeberte atribut názvů souborů z metody dokončení
      compopt +o názvy souborů 2>/dev/null

      if ! [[ $(uname -s) =~ Darwin* ]]; then
        odpovídá[$i]=$(printf '%*s' "-$COLUMNS" "${matches[$i]}")

        COMPREPLY+=("$(compgen -W "${matches[$i]}")")
      else
        COMPREPLY+=("${matches[$i]// */}")
      fi
    hotovo
  fi
}

# Bash programovatelné dokončení pro funkci goto
_complete_goto_bash()
{
  local cur="${ COMP_WORDS[$COMP_CWORD]}" předchozí

  if [ "$COMP_CWORD" -eq "1" ]; then
    # pokud jsme na prvním argumentu
    if [[ $cur ==-* ]]; potom
      # a spustí se jako příkaz, příkazové příkazy
      _complete_goto_commands "$cur"
    else
      # a nespustí se jako příkaz, příkazové aliasy
      _complete_goto_aliase $cur"
    fi
  elif [ "$COMP_CWORD" -eq "2" ]; potom
    # pokud jsme u druhého argumentu
    prev="${COMP_WORDS[1]}"

    if [[ $prev ="-u" ]] || [[ $prev ="--unregister" ]]; potom
      # zobrazí výzvu s aliasy, pokud se uživatel pokusí zrušit registraci jednoho
      _complete_goto_aliases "$cur"
    elif [[ $prev ="-x" ]] || [[ $prev ="--expand" ]]; potom
      # zobrazí výzvu s aliasy, pokud se uživatel pokusí rozbalit jeden
      _complete_goto_aliases "$cur"
    elif [[ $prev ="-p" ]] || [[ $prev ="--push" ]]; then
      # zobrazí výzvu s aliasy pouze v případě, že se uživatel pokusí vložit
      _complete_goto_aliases "$cur"
    fi
  elif [ "$COMP_CWORD" -eq "3" ]; potom
    # pokud jsme u třetího argumentu
    prev="${COMP_WORDS[1]}"

    if [[ $prev ="-r" ]] || [[ $prev ="--register" ]]; potom
      # vyzve s adresáři pouze v případě, že se uživatel pokusí zaregistrovat alias
      local IFS=$' \t\n'

      # shellcheck disable=SC2207
      COMPREPLY=($(compgen -d -- "$cur"))
    fi
  fi
}

# Zsh programovatelné dokončení pro funkci goto
_complete_goto_zsh ()
{
  local all_aliases=()
  while IFS=read -r line; do
    all_aliases+=("$line")
  hotovo <<<"$(sed -e 's/ /:/g' ~/.goto 2>/dev/null)"

  local state
  local -a options=(
    '(1)'{-r,--register}'[registruje alias]:register:->register'
    '(- 1 2)'{-u,--unregister}'[zruší registraci aliasu]:unregister:->unregister'
    '(:-)'{-l,--list}'[seznamy aliasy]'
    '(*)'{-c,--cleanup}'[vyčistí neexistující aliasy adresáře]'
    '(1 2)'{-x,--expand}'[ rozbalí alias]:expand:->aliases'
    '(1 2)'{-p,--push}'[vloží aktuální adresář do zásobníku a poté provede goto]:push:->aliases'
    '(*)'{-o,--pop}'[zobrazí horní adresář ze zásobníku a poté se přepne do tohoto adresáře]'
    '(:-)'{-h,--help }'[vytiskne tuto nápovědu]'
    '(* -)'{-v,--version}'[zobrazí verzi skriptu goto]'
  )

_arguments -C \
    "${options[@]}" \
    '1:alias:->aliasy' \
    '2:dir:_files' \
  &&ret =0

  případ ${state} v
    (aliasy)
      _describe -t aliasy 'goto aliasy:' all_aliases &&ret=0
   ;;
    (zrušit registraci)
      _describe -t aliasy 'unregister alias:' all_aliases
   ;;
  esac
  return $ret
}

goto_aliases=($(alias | sed -n "s/.*\s\(.*\)='goto'/\1/p"))
goto_aliases+=("goto")

pro i v "${goto_aliases[@]}"
        do
                # Zaregistrujte dokončení goto.
        if [ -n "${BASH_VERSION}" ]; pak
          pokud ! [[ $(uname -s) =~ Darwin* ]]; potom
            dokončete -o názvy souborů -F _complete_goto_bash $i
          else
            dokončete -F _complete_goto_bash $i
   if   SH n - " $ br potom
          compdef _complete_goto_zsh $i
        else
          echo "Nepodporovaný shell."
          ukončení 1
        fi
udělejte

Toto bylo původně publikováno jako README v úložišti GitHub goto a je znovu použito se svolením.


Linux
  1. Úvod do používání tcpdump na příkazovém řádku Linuxu

  2. Počítejte v linuxovém shellu s GNU bc

  3. Úvod do linuxových příkazů chgrp a newgrp

  1. Úvod do linuxového příkazu chmod

  2. Úvod do linuxového příkazu chown

  3. Jak používat aliasy shellu v Linuxu

  1. Jak změnit výchozí prostředí v Linuxu

  2. Jak změnit výchozí shell v Linuxu

  3. Linux shell třídit soubor podle druhého sloupce?