Come forzare una parola Bash a fare riferimento a un alias, una funzione, un file, ecc.?


13

Quando ho cercato di aggiungere un po 'più di dettaglio a una domanda correlata , mi sono reso conto di non sapere come specificare quale dei tipi di parole Bash disponibili eseguire. Secondo help typeci sono cinque tipi di parole:

  • alias
  • parola chiave
  • funzione
  • incorporato
  • file

È possibile che una parola abbia diversi tipi ( trueè solo un esempio; una parola più comunemente sostituita sarebbe cd):

$ type -a true
true is a shell builtin
true is /bin/true

Come si forza l'esecuzione di un sinonimo specifico? Finora, in ordine di precedenza:

  • alias: questo è un caso speciale poiché ha la precedenza su tutti gli altri sinonimi. Forzare questo sarebbe utile solo quando il comando non riusciva se l'alias non è definito.

    $ 
  • parola chiave:

    $ 
  • funzione:

    $ 
  • incorporato:

    $ builtin true
  • file:

    $ command true
    $ $(which true)
    $ /bin/true

Soluzioni parziali :

  • La citazione di una parola esclude alias e parole chiave. Questo è,

    $ 'true'

    eseguirà solo la funzione, il file incorporato o il file.

Risposte:


10

Quello che stai chiedendo non ha molto senso.

parola chiave significa che è una parola che fa parte della sintassi della shell. Questi sono riconosciuti attraverso il tokenising. Citarli è sufficiente perché la shell smetta di riconoscere.

Tuttavia, è possibile aliasare una parola chiave nella maggior parte delle shell. Quindi, gli alias hanno la precedenza sulle parole chiave (in effetti sono espanse in anticipo e c'è più tokenising dopo quello in cui puoi avere più alias, parole chiave) ...

alias (ad eccezione degli alias zsh definiti con alias -gvengono espansi solo nella posizione di comando), quindi in genere non in builtin the-alias.

le funzioni hanno la precedenza su builtin e builtin su comandi esterni (e quindi $PATHdecide quale utilizzare).

Puoi forzare l'integrato con:

builtin the-cmd and its args

(anche se va notato che non è un comando standard).

È possibile disabilitare gli alias citandoli (anche se la versione citata potrebbe anche essere aliasata in alcune shell).

Quindi, per esempio (qui sintassi di zsh), in:

'while'() echo function while
alias 'while=echo alias while'

La scrittura while trueverrebbe effettivamente prodotta alias while truee non ci sarebbe modo di usare la whileparola chiave poiché la quotazione disabiliterebbe sia l'alias che la parola chiave.

Chiamereste la whilefunzione con ad esempio:

'whi'le whatever

Se ci fosse un whilebuiltin (ma ovviamente il loro non sarebbe in quelle shell che hanno una whileparola chiave), lo scriveresti:

builtin while whatever

E per chiamare il whilecomando, dovresti scrivere:

env while whatever

o in zsh(quando non in shemulazione):

command while whatever 

(in altre shell, commandimpedisce solo le funzioni, non i builtin)

O

/full/path/to/while whatever

Naturalmente, nulla ti impedisce di fare cose ancora più sciocche come:

alias 'while=while "w"hile; do'
"while"() { while "whi"le; done; }

Che, almeno in zsh è valido (ma stupido).


La quotazione sopprime la ricerca alias e command sopprime la ricerca delle funzioni, ma nessuna di queste specifica quale dei sinonimi rimanenti verrà utilizzato. Sto cercando un modo per specificare di eseguire solo un sinonimo specifico .
1313

@ l0b0 "command" elimina tutto l'alias, la parola chiave e il builtin.
Stéphane Chazelas,

Per quanto riguarda il senso, builtinviene utilizzato ad esempio RVM per sostituire cdun effetto piacevole.
1313

Hai ragione; e ho appena verificato che sopprime anche le funzioni. +1.
1313

0

Un linguaggio estremamente utile per me è questo:

FALSE=1; TRUE=0
DEVEL_FLAG=$FALSE
...
in_development() { return $DEVEL_FLAG ; }
cd()
{
 if in_development ; then # -D argument to script toggles development flag
   echo "Would run cd $*"
  else
   builtin cd "$@"
 fi
}

Ora se eseguo lo script con -D specificato, viene attivata la modalità di sviluppo e il cd (o qualsiasi altro comando racchiuso) fa eco alle informazioni di debug

Ciò è particolarmente utile con gli script che eseguono ssh. Certo, potrei attivare set -x, ma per me è più utile e leggibile.


1
Come risponde alla domanda?
l0b0
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.