¿Alias ​​no "anula" las entradas de RUTA?

9

La última línea de mi .bash_profilees:

alias cp=/usr/local/bin/gcp

Sin embargo, eso está siendo aplastado por la entrada en mi $PATH:

$which cp
/bin/cp
11:54:32/OCspark $type cp
cp is aliased to `/usr/local/bin/gcp'

Pensé que los alias anulan el PATH...?

javadba
fuente
1
Para el registro: técnicamente, los alias no anulan ningún valor en el PATHenvar.
can-ned_food
Precaución obligatoria: en general, no es una buena práctica cambiar el nombre de los comandos comunes. Esto puede morderte de dos maneras. 1) Si trabaja en otro sistema y usa su comando por hábito, obtendrá el comportamiento inesperado del comando nativo. 2) Si alguien más usa su sistema, incluso para asesorarlo / ayudarlo a resolver un problema, obtendrá el comportamiento inesperado de su personalización. Los comandos personalizados están bien, simplemente no los nombres igual que los existentes comunes.
Joe
@joe En realidad, es más al revés aquí: la versión os / x de cp carece de opciones de nix, por lo que no se comporta como se esperaba (excepto para aquellos a quienes * les gusta la versión mac de
hobbled

Respuestas:

21

El whichcomando solo devuelve ejecutables: no sabe nada acerca de los alias, ya que es un programa externo y no existe un mecanismo para pasar la información de alias a un proceso secundario.

Si ingresa el comando type -a cp, verá todas las interpretaciones posibles, en orden de preferencia. Esto incluye cualquier alias, ya que typees un bashcomando interno.

Es importante darse cuenta de que un alias no será interpretado por un subproceso, como un script o un editor interactivo que tenga la opción de ejecutar comandos del sistema.

Si realiza cpuna función, su versión se ejecutará en scripts, aunque no desde otros programas:

cp() { /usr/local/bin/gcp "$@"; }

Si desea cpque trabaje en todas partes, agregue $HOME/binal principio de su PATHlista y apunte $HOME/bin/cppara señalarlo:

ln -s /usr/local/bin/gcp $HOME/bin/cp

Esto crea un enlace simbólico, aunque puede hacerlo un enlace duro un poco más eficiente (omitir -s), pero normalmente necesitará permisos de root ( sudo ln ...). La creación de una función y la adición a la PATHvariable se realizarán en uno de los bashscripts de inicio, con permisos de usuario.

AFH
fuente
1
Aunque en CentOS (y AIUI todo RedHat) el perfil estándar (a menos que se anule) crea un alias para whichque se ejecute /usr/bin/whichcon entrada canalizada desde la salida de aliasy una opción que le dice que lea esa entrada y la use para mostrar un alias si coincide con el mando. Ver unix.stackexchange.com/questions/10525/…
dave_thompson_085
@ dave_thompson_085 - Comentario interesante: no he usado esas distribuciones. Yo uso Ubuntu y puedo conseguir el mismo efecto con sólo aliasing whicha type. Luego which -aopera como el programa externo, con la adición del alias y las definiciones de funciones. En general no alias which=type, porque me gusta usar $(which ProgName)cuando quiero forzar el uso de un programa externo, sin pasar por ningún alias o definición de función.
AFH
1
Los enlaces duros no pueden cruzar sistemas de archivos, por lo que la lnsugerencia no simbólica solo funcionará si su directorio de inicio está en el mismo sistema de archivos que /usr/local/bin. También se comportará de manera extraña si actualiza gcp, ya que su enlace duro probablemente todavía se referirá a la versión anterior.
Inútil
@Useless: puntos válidos, que es parte de por qué edité mi respuesta para sugerir un enlace simbólico primero, aunque creo que los permisos son probablemente la consideración más importante. En cuanto a la actualización gcp, dependerá de si la actualización se realiza abriendo y escribiendo o eliminando y volviendo a crear. Tenga en cuenta que es irrelevante si se utiliza una ruta de origen absoluta o relativa para crear un enlace duro, mientras que un enlace simbólico generalmente necesita una ruta absoluta. Los enlaces se usan ampliamente en el sistema operativo, y en su mayoría son simbólicos.
AFH
1
@ can-ned_food: no es tan simple como configurarlo en el shell actual: debe configurarse en cada script, junto con la importación de los alias.
AFH
13

Los alias son internos al shell. Otros programas no sabrán sobre ellos.

whichno es un Bash incorporado (es un incorporado en otros shells, por ejemplo, zsh). Como whichno tiene información privilegiada sobre los alias de Bash, whichsolo busca PATHel término dado.

type, por otro lado, es un Bash incorporado, por lo que puede informar sobre alias.

8bittree
fuente
2
Y, también, los alias solo se expanden si la primera palabra en un comando. Quizás eso no sea relevante.
can-ned_food