|
|
La siguiente lista son los trucos y atajos del intérprete de órdenes de UNIX que he aprendido en el relativamente poco tiempo que he estado en contacto con este sistema operativo (dos años). Me ha parecido en cierta forma necesario hacer una lista así, ya que de otra manera estas cosas, que en la mayoría son muy útiles para el trabajo diario, se aprenderían de una manera bastante lenta.
Por supuesto, si quieres añadir alguno más, hacer una corrección, preguntar cualquier cosa.... Estoy a tu disposición como mínimo mediante el correo electrónico
text-utils.8.4.1.documentation.linux.tar.gzNo tendremos más que escribir los primeros tres o cuatro caracteres, o menos, y pulsar ESC-ESC. Por supuesto, podremos movernos por directorios con este truco, y nos rellenará nombres de ficheros que no estén necesariamente en el directorio actual.
$FIGNORE. Esta
variable debe contener una lista separada por ':' de
"extensiones" a ignorar por el intérprete. Por ejemplo,
normalmente nosotros no vamos a utilizar órdenes con los ficheros
objetos (terminados por convenio en '.o'), así que
podemos poner en nuestro .profile una línea como:
FIGNORE='.o'Y así, la próxima vez que tengamos los ficheros
foo.c y foo.o en nuestro directorio
actual, al escribir f[ESC][ESC] nos
rellenará el nombre foo.c directamente.
.profile (es decir, en
cualquiera de los archivos de configuración. En linux --suponiendo que
usas bash-- podría ser .bash_profile) la
línea set -o emacs. Los atajos de teclado son los
siguientes:
Ir al principio de la línea - ^A Ir al final de la línea - ^E Borrar hasta el principio de la línea - ^U Borrar hasta el final de la línea - ^K Borrar la palabra a la izquierda - M-BS Moverse una palabra adelante - M-F Moverse una palabra atrás - M-B Limpiar la pantalla - ^L Pegar la línea anterior - ^Y Repetir el último parámetro - M-.Lo de M-x significa Meta, es decir, que o bien lo haces con la tecla Alt, o bien pulsas Esc y luego la tecla x. BS significa BackSpace.
(arg: número)$ Lo que tuviéramos escritoEn este momento, podremos seguir pulsando números, o ESC si nos hemos equivocado o nos arrepentimos. Estos números se irán escribiendo en
arg. Este número serán las
veces que se va a repetir el caracter que pulsemos a continuación. Es
un truco un poco macarrónico, ya lo sé, pero igual te sirve para
algo.
for, que
se puede utilizar para procesar varios ficheros con una orden que sólo
acepta uno. Incluso podrías utilizarlos para convertir todos los
nombres de los ficheros del directorio actual en minúsculas, y
virguerías varias.
Nombre del usuario - \u Directorio de trabajo - \W Ruta completa de trabajo - \w La hora actual - \t La fecha actual - \d El nombre del intéprete - \s El nombre de la máquina actual - \h El número de la orden - \# La posición en el history - \! Caracter de prompt según derechos - \$ [*] Caracter nnn (en octal) - \nnn[*] - Significa que si el UID efectivo (la identificación de usuario efectiva) es 0, o sea, el root, saldrá un "#". Si no, un "$"
info bashAllí tendrás que buscar las características propias del Bourne Again SHell (están las características heredadas del Bourne Shell, del C Shell, del Korn Shell, y las propias, originales del Bourne Again Shell), y una vez dentro de eso, un tema parecido a Printing a Prompt.
.profile o el .bash_profile, para
asegurarse de que se ejecuta siempre que entramos en la cuenta.
El mío, para que te hagas una idea, tiene el siguiente valor:
PS1="zoso:\w$ "No olvides poner al final un espacio, porque si no, las instrucciones quedarán pegadas al prompt, lo que es un tanto antiestético.
'\w') no funcionan en el intérprete de los
ordenadores de sopa (sólo en los PCs). La solución que puedo dar
es detectar cuándo se está entrando a la cuenta desde Linux y
cuando desde otro. La única solución que se me ha ocurrido es
mirar la variable de entorno $TERM, que indica el tipo de
terminal que se está usando. Cuando no sea Linux, probablemente utilice
vt100. Cuando sea Linux, utilizará console, como en sopa,
o linux, como en mi casa. Quizás dependa de la versión o
de la configuración de cada instalación o distribución de
Linux. Puedes probarlo fácilmente, poniendo
echo $TERMAsí, dependiendo de la respuesta que obtengas, pondrás en el fichero
.profile (o el que sea) algo como esto.
if [ "$TERM" = "console" ]; then PS1="linux:\w$ " fiO algo parecido. Lo de poner tu nombre o la máquina en la que se está ejecutando, seguido de dos puntos, suele quedar bien como prompt.
$SYSTEM. Ésta contiene el nombre de la
máquina, que es o bien "so.dis.ulpgc.es" o bien
"so##.dis.ulpgc.es" para los PCs. Si te aprovechas de eso, puedes
escribir en el .profile algo como:
if [ "$SYSTEM" != "so.dis.ulpgc.es" ]; then PS1="linux:\w$ " fiAunque creo recordar que tuve problemas con esto también. ¿Alguna sugerencia?
sh normal no, pero algunos
más modernos sí (creo que el Korn Shell), y desde luego el
bash lo trae.pushd y
popd. Funcionan como si fueran una pila:
pushd necesita un parámetro, y se mueve al
directorio que se de como parámetro, dejando en la pila de directorios
el directorio actual. popd no necesita parámetros,
y se mueve al directorio que esté en la cima de la pila de
directorios.cd -, que
nos mueve al directorio anterior en que estuviéramos. Así, si
estamos en ~/prog/c, y nos pasamos por un momento a
/usr/doc/HOWTO/translations/es/other-formats/html (haciendo
un uso inteligente del truco del doble ESC, claro :), podemos volver a
~/prog/c con sólo escribir cd
-.~- representa el directorio anterior. Así, podemos
estar en un directorio donde hay un fichero que queremos copiar. Luego,
movernos al directorio destino, y copiar el fichero con sólo escribir:
cp ~-/fichero_a_copiar .
tar y el gzip.tar, hay que escribir:
tar cvf fichero.tar conjunto de archivos a empaquetar gzip -v9 fichero.tarNótese que las v's en ambas líneas son para activar el modo verboso. Si no te gusta o no quieres que te saque mensajes por la pantalla diciéndote qué va haciendo, no pongas las v's. Nótese que la orden
gzip no
necesita un segundo parámetro, ya que como sólo comprime un
fichero, simplemente le añade al final la extensión '.gz'.
El '9' en el gzip es para máxima compresión. Si
tienes prisa y no te importa que comprima menos, puedes quitárselo.
Ambas instrucciones permiten el manejo de los flujos estándar de datos,
y eso puede resultar útil algunas veces. Eso es mejor que lo mires en
las páginas del man, o con info,
pero te diré que en el gzip es con la opción
-c, y en el tar es indicando como
fichero de entrada o salida '-'.
Para los que tengan versiones nuevas del tar, por
ejemplo por utilizar Linux, pueden generar un archivo .tar.gz directamente
poniendo como opciones cvfz, y descomprimirlo usando
xvfz.
~ es importante en el mundo UNIX
por cuatro cosas:bin a partir de
nuestro directorio raíz, sólo tenemos que escribir
~/bin.
~nombreusuario.
Aunque claro, esto no es muy útil para los usuarios normales, excepto
cuando tienen que acceder, por ejemplo, al directorio de su compañero
de prácticas.
~ indica que hay que buscar en el directorio del usuario
a2092, que soy yo.
~ es 126).~, éste se puede reemplazar por
%7E (quizás lo hayas visto en alguna
dirección).
man, porque si no, Gabino se va a enfadar contigo :).man,
no lo de Gabino), pero hay algunas cosas sobre la ayuda que a lo mejor no sabes:
man acepta un número
antes del tema de ayuda a buscar, para especificar en qué parte del
manual debe buscar. Esto es útil a veces, porque no es lo mismo, por
ejemplo, la orden date del sistema que la función
date de C. En algún sitio debe haber una lista de qué
significa cada número en el manual de UNIX. Al escribir esto no estoy en
Linux (y no tengo ganas de reiniciar), así que, mientras no me acuerde de
mirarlo (tengo muy mala memoria, yo que tú no me fiaría), puedes
intentar localizar tú la lista poniendo:
man man
man con la
opción -k, podremos darle una palabra, para que
busque en las páginas del manual un tema que nos pueda interesar. En
algunas distribuciones de linux, como la RedHat que vino en la
Programación Actual (4.2) nunca saca resultados por pantalla
cuando haces eso. Es porque tienes que crear (y actualizar de vez en cuando)
una base de datos (de la orden whatis, me parece). La
orden para crear/actualizar la base de datos varía, pero en la
distribución RedHat se hace poniendo /usr/sbin/makewhatis
-w. Es importante la ruta, porque el directorio
/usr/sbin no está en el $PATH
del root. Así, en realidad no es absolutamente necesario que nos
sepamos el nombre de la orden sobre la que buscamos ayuda, aunque sirve de
mucha ayuda (valga la rebuznancia). También podemos, en vez de
escribir man -k, poner apropos.
info. Esta ayuda, en realidad, suele estar más
actualizada que las propias páginas del man,
así que es una buena idea utilizarlo. Creo que esto del
info es un invento de GNU, aunque no estoy seguro.man, así que mírate el
tutorial que viene en la página principal, cuando lo llamas sin
parámetros, que tampoco tardas tanto y sirve de mucha ayuda.
Cero o más ocurrencias de a - a* Una o más ocurrencias de a - a+ Una o ninguna ocurrencia de a - a? a ó z - [az] Cualquier caracter entre a y z - [a-z] Cualquier cosa menos a ó z - [^az] Cualquier caracter excepto new-line - . Ristra al principio de la línea - ^Ristra Ristra al final de la línea - Ristra$ Principio de una palabra - \< Final de una palabra - \> Salvar lo que cace expreg - \( expreg \) Restaurar el texto cazado [*] - \número[*] Sólo se puede utilizar en la segunda parte de las sustituciones, y el número es el número del paréntesis que se quiere recuperar (es decir,
\1 recupera el texto
cazado por la primera pareja de paréntesis en aparecer, etc.)\ (barra
invertida), y que si quieres reunir más de un caracter, por ejemplo
para repetir una o más veces la ristra ab, en vez de sólo
la b, puedes utilizar los paréntesis (o sea, que la
expresión de una o más ab's seguidas sería
(ab)+).
tsm el
programa de multitarea, pero el caso es que se llama así. En Linux
no es necesario, porque como supongo que sabes puedes cambiar las sesiones
activas con Alt+F1, Alt+F2, Alt+F3... Son sesiones
independientes, que tienes que abrir y sobre todo
cerrar por separado.tsm. Una vez hecho esto,
saldrá un mensajito de información, diciéndote las teclas
que necesitas y todo eso (¿Dios mío, verbosidad en UNIX?
¿Sin pedirla? Imposible). Las únicas que necesitas (y
tampoco creo que esa ayuda te dé más información) son
Control-W para cambiar de ventana (te dice en qué sesión
estás, y si pulsas un número cambias de sesión), y
Ctrl-T para ir al menú. Desde allí puedes configurar el
tsm, y salir. De todas formas, si intentas hacer un
exit, creo que a veces te saca el menú, desde donde
puedes salir o configurar el programa.
alias.ls sin
parámetros, sino que por lo general usa ls -l, que
lista los detalles de los ficheros.ll (suponiendo que lo haces desde sopa) consigues el mismo
resultado. ¿una nueva orden? No. Un alias. Un
alias no es más que una sustitución de las
órdenes que escribimos en la línea de órdenes.
Así, el intérprete sustituye ll por
ls -l cuando lo ve al principio de la orden. La sintaxis
del alias es:
alias ristra1='ristra2'Donde ristra1 es la ristra a utilizar, y ristra2 es la ristra que se va a sustituir. Así, en
/etc/profile,
o algún sitio parecido, debe haber una línea que ponga esto:
alias ll='ls -l'Algunos
alias útiles son poner que por
defecto, el rm, cp y
mv pregunten antes de borrar/sobreescribir ficheros (El
linux RedHat lo hace con el root por defecto), con las siguientes
líneas:
alias cp='cp -i' alias mv='mv -i' alias rm='rm -i'En cualquier momento, si queremos cambiar este comportamiento, podemos utilizar la opción
-f, que ignora la posible
opción -i. Por ejemplo, si deseamos borrar un
directorio recursivamente, y estamos seguros, podemos utilizar rm -rf
directorio, ya que de otra manera, si tuviéramos el
alias puesto, nos preguntaría fichero por
fichero, lo que sería doloroso de contestar si hubiera muchos.alias útil es el
alias ls='ls --color'. Esto, en Linux, permite que el
ls salga siempre en color. También es muy útil
(yo lo utilizo mucho de esa forma) para escribir rápidamente una
secuencia de instrucciones que tienes que repetir. Por ejemplo, si tienes que
escribir varias veces seguidas:
make foo cd ../bin foo >salida 2>erroresPuedes simplificarlo poniendo:
alias foobar='make foo; cd ../bin; foo >salida 2>errores'En la línea de órdenes. Este
alias se
recordará hasta que salgas de la cuenta.
Si alguna vez te molesta alguno que tienes definido, sólo
tienes que escribir unalias ristra-aliaseada para
deshacerte de él.
Mandar un proceso a segundo plano (lo para) - ^Z Ejecutar la orden orden en segundo plano - ordenSi tienes dudas, en las páginas del intérprete seguro que encuentras ayuda, y en las páginas del&Seguir ejecutando en segundo plano un proceso parado -bgTraer un proceso al primer plano -fgMandar señal a un proceso (matar, por defecto) -killPID Lista actual de tareas -jobLista actual de procesos -ps
kill y
el ps puedes encontrar información de referencia.
Si tienes dudas, ¡pregunta!
/usr/src/linux, aunque, si entras en el directorio
/usr/src y haces un ls -l,
verás que aparece algo parecido a:
total 2 drwxr-xr-x 15 root root 1024 Mar 22 17:17 kernel-source-2.0.30 lrwxrwxrwx 1 root src 20 Mar 22 17:33 linux -> kernel-source-2.0.30 drwxr-xr-x 2 root root 1024 Mar 21 1997 redhatTambién es muy útil para mover un directorio o ejecutable de sitio, pero que se siga pudiendo llamar de la manera antigua, o para poder llamar a un programa de maneras diferentes (por ejemplo, en las distribuciones de Linux, el
vi
es un enlace simbólico al vim o al elvis).cd ..,
volveremos a donde estábamos antes. Esta es la diferencia
más importante que existe entre los enlaces de UNIX y los accesos
"directos" de Micro$oft. Cuando en Windows NT/'95, por ejemplo,
tienes un acceso directo en /winnt/profiles/zoso/prog (sí, pongo barras
de directorios de UNIX porque me da la gana) que apunta a /utilidad/prog/, al
pulsar la tecla BackSpace en la ventana de /utilidad/prog, volveremos a
/utilidad, no a /winnt/profiles/zoso, que es a donde tendríamos que
volver. Esto se puede emular en UNIX, inicializando una variable (que depende
del intérprete que estés utilizando) al valor adecuado (consulta
el manual).ln fichero-a-donde-apunta nombre-del-enlacey los simbólicos con:
ln -s fichero-a-donde-apunta nombre-del-enlace
:set
autotext), el vim automáticamente detecta el tipo de fichero
que es (DOS o UNIX), y si es DOS, quita los ^M de la
pantalla. Esto de los ^M ocurre porque el delimitador de
línea de los ficheros de texto en DOS es CR-LF (carriage
return-linefeed, o sea, retorno de carro y salto de línea), y en UNIX
son simplemente LF. Así, muchas herramientas de UNIX (al menos por
defecto), buscan como delimitador de línea el LF, así que al
final de cada línea hay un caracter extraño (el CR).:%s/<Ctrl-V><Ctrl-M>//Te comento por encima qué significa este chorizo: El "%" sirve para que se sustituya en todas las líneas, y no sólo en la actual, la "s" para que se realice una sustitución, el Ctrl-V Ctrl-M es necesario para que el vi no se crea que estamos pulsando un ENTER (Ctrl-V sirve para insertar literales), y, por supuesto, se sustituye por nada, así que entre la segunda y la tercera barras no ponemos nada.
sed 's/<Ctrl-V><Ctrl-M>//' fichero-CRLF >fichero-LFSi no conocías el sed (lo más probable, porque si lo conocieras ya se te habría ocurrido a ti el truco), es una herramienta bastante versátil de proceso de texto (no tanto como el perl, claro :), y no muy complicada de utilizar.
pushd y el popd).mtools. Estas herramientas son programas que permiten
interactuar con discos con formato MS-DOS (que yo sepa, también puedes
leer discos duros, pero eso es más cómodo tenerlo montado). La
sintaxis de estas órdenes es la misma que para las operaciones normales
de MS-DOS, sólo que hay que añadir m al
principio de las órdenes (con frecuencia es necesario para no
confundirlas con las órdenes propias de Linux). Así, puedes
hacer un mdir, que por defecto hará un
ls del disco flexible, cambiar de directorio con
mcd, copiar desde Linux al disco y viceversa con
mcopy, etc. Estas órdenes, aunque pueda sonar
extraño, van mucho más rápido que en MS-DOS (no son
imaginaciones mías: haz la prueba y verás).
zoso:~$ historyEn cualquier momento. Esto mandará a la salida estándar la lista actual de órdenes, numeradas debidamente. También podemos insertar la posición de la orden dentro de la lista en el propio "apuntador" (prompt). Para repetir una orden que ya esté en la "historia", tenemos varias posibilidades:
!!
zoso:~$ !número
zoso:~$ cat Hola, mundo Hola, mundo ^D zoso:~$ !c foo cat foo cat: foo: No such file or directoryEn el ejemplo anterior podemos ver que al repetirse una orden, se manda a la terminal la orden completa a ejecutar (no se manda a la salida estándar, así que no interfiere en los resultados si redireccionamos o cosas por el estilo. Se imprime solamente para información del humano que maneja la terminal).
bash tiene una opción
muy interesante llamada cdspell, que te corrige cuando te equivocas
al escribir el nombre de un directorio, al intentar cambiar a éll con
la orden cd.shopt -s cdspellDonde
shopt viene de shell option. Si
buscas shopt en el manual en línea, saldrá
la página de las funciones internas (built-ins), donde puedes
encontrar otras cosas interesantes (otras funciones internas y otras opciones
a poner o quitar con la orden shopt).
Recuerda: todo está en los libros. Si tienes dudas
o quieres aprender más sobre estas cosas, en la biblioteca
tienes un montón de libros interesantes, sobre linux,
administración de sistemas... También tienes las
linux HOWTOs, y la información de las páginas del
info y el man