Ziŝaj Konsiletoj 1-a: Alinomoj kaj Funkcioj

Esperanto • English
Laste ĝisdatigita: la 18-an de marto 2022

Malsaĝulo miras pri nekutimaj aferoj. Ŝagulo miras pri la kutimaj aferoj.
—Konfuceo

omair-parvez-o6ka1Lpk81U-unsplash

Enhavotabelo

Enkonduko

Unu el la ĝuoj de ekskluzive labori ĉe la terminalsimulilo estas la laboron pri komandoj, dosieroj, kaj dosieroj ĝi plifaciligas. Esti kapable por iri de ideo al ideo okazas en malmulte da tempo. Por interaga ŝela uzo, ziŝon mi uzas preskaŭ eksklusive. En ĉi tiu artikolo mi parolos pri la aĵoj por la interagan uzon de la ŝelo plibonigi.

Estas almenaŭ tri tipoj de komandoj en Ziŝo: duumdosieroj, alinomoj, kaj funkcioj. Duumdosieroj, estas tiuj kiuj troveblas en la $PATH; ili estas la programoj, kiujn oni instalis per la pakadministrilo. Alinomoj kaj funkcioj, aliflanke, ne loĝas kiel dosieroj ĉe la dosiersistemo. Ili estas difinitaj kiel parto de la agorddosiero, aŭ entekstitaj en la seanco.

Alinomoj

Alinomoj estas tiuj beletaj malsaĝaj aĵoj kiujn oni metas en la agorddosieroj kiuj bagatelajn unu liniajn komandojn faras. Multaj el ili aspektas jene:

alias ls="ls -F"

Aliaj estas pli agresivaj kiel tutmondaj alinomoj, kiuj malvolvojn povas fari ie ĉe la komandlinio:

alias -g G="|& rg --color auto"
alias -g NF='*(.om[1])'

La ĉefenigujon kaj ĉefeligujon la unua tutmonda alinomo filtras al egrep kun kolorita eligo. La plej novan kutiman dosieron en la aktuala dosierujo la dua tutmonda alinomo revenas.

Por ĉiomajn alinomojn montri, rulu:

alias

Funkcioj

Funkcioj, aliflanke, estas la pli grandaj parencoj de alinomoj. Ili povas fari pli multe ol siaj malpliaj kolegoj povas fari. Unu el la plej gravaj kontrastoj por teni en la kalkulo, estas, funckiojn povas fari pli ol anstataŭigon. Ekzemple, en la jena alinomo:

alias ve="echo hundo"

tekstan anstataŭigon nur faras. Tio estas, kiam la tekston hundo ziŝo trafas kiel la unua ero de la komandlinio, ĝin ĝi anstataŭigas per echo hundo. Nenio plu. Do, rulante jene:

ve

fariĝas

echo hundo

La jenajn liniojn kontrastu:

alias hundo0="for x in hundo kato muso; do echo $x; done"
function hundo1 () { for x in hundo kato muso; do echo $x; done }

La ŝlosilvorto function estas redunda kaj povas esti ellasita. Ilin rulu kaj la resultojn rimarku:

% hundo0
% hundo1

Pli altan prioritaton alinomoj havas pli ol funkcioj. La jenajn liniojn konsideru:

alias hundo="echo hundo"
function hundo () { echo hundo, ankaux }

La nomon hundo ambaŭ uzas, sed malsaman nomspacon ĉiu uzas. Kiam je hundo oni rulas:

% hundo
hundo

Nur je hundo ĝi montras, anstataŭ je hundo, too eĉ ĉi tiu venas de pli nova difino. Por la alinomon hundo forigi, rulu:

% unalias hundo
% hundo
hundo, too

Tiel longe kiel eble, funkciojn rulu:

Por ĉiomajn funkciojn montri, rulu:

% functions

Ĉion rikolti

La agorddosieron malpurigi per plenaj funciaj difinioj por ĉiu malgranda komando, kiun oni volas havi estas malŝaga. Anstataŭe, pli bonan manieron por tutmondajn alinomojn kaj malgrandajn funkciojn ni uzos. La dosieron ~/.zshenv malfermu per la plej ŝatata redaktilo.

La funkciojn, kiu la aliajn difinas, ni unue difinu:

function def_real_alias () {
  while [[ $# -ge 2 ]]; do
    alias "$1=$2"
    shift 2
  done
}

function def_real_aliases () {
  def_real_alias $real_aliases
  unset real_aliases
}

function def_global_alias () {
  while [[ $# -ge 2 ]]; do
    alias -g "$1=$2"
    shift 2
  done
}

function def_global_aliases () {
  def_global_alias $global_aliases
  unset global_aliases
}

function def_fun () {
  while [[ $# -ge 2 ]]; do
    eval "function $1 () { $2 \$@ }"
    shift 2
  done
}

function def_funs () {
  def_fun $funs
  unset funs
}

Sekve, la tabelojn ni difinu:

real_aliases=(
  ve "echo hundo"
); def_real_aliases

global_aliases=(
  :: ':>!'

  B '`git rev-parse --abbrev-ref HEAD`'

  V "|& less"
  G "|& rg --color auto"
  S "|& sort"
  R "|& sort -rn"
  L "|& wc -l | sed 's/^\ *//'"

  H  "|& head"
  T  "|& tail"
  H1 "H -n 1"
  T1 "T -n 1"

  ZF '*(.L0)'     # zero-length regular files
  ZD '*(/L0)'     # zero-length directories

  AE '{,.}*'      # all files, including dot files
  AF '**/*(.)'    # all regular files
  AD '**/*(/)'    # all directories
  AS '**/*(@)'    # all symlinks

  OF '*(.om[-1])' # oldest regular file
  OD '*(/om[-1])' # oldest directory
  OS '*(@om[-1])' # oldest symlink

  NF '*(.om[1])'  # newest regular file
  ND '*(/om[1])'  # newest directory
  NS '*(@om[1])'  # newest symlink

); def_global_aliases

funs=(
  z "exec zsh"
  s "sudo"

  d "pushd"
  \- "popd"
  ds "dirs -l"

  cp "command cp -i"
  mv "command mv -i"

  l "ls -GFAtr --color"
  la "ls -AF --color"
  ll "l -l
  l1 "l -1"
  lh "l -H"
  lr "l -R"
  lk "la -l"

  sl "ln -sf"
  md "mkdir -p"

  f "fd"
  g "ripgrep --color auto"
  gi "g -i"
  tf "tail -F"
  rh "rehash"

  mount "s mount"
  umount "s umount"
  reboot "s reboot"
  poweroff "s poweroff"
  halt "s halt -p"
); def_funs

Finrimarkoj

Komandojn grupigi tiel la procedon por novajn erojn aldoni kaj forigi plifaciligas. Ĉion porti en unu kunfandita loko la agorddosieron igas aserteble pura. Por la restantajn difinojn iru ĉi tien.

Se giton vi uzas, la artikolo pri kiel ĝi mi uzas, eble ankaŭ plaĉas al vi. Ĝi troviĝas ĉi tie.

Dank’ al Jakub JAREš pro la korektoj.