Manuales para la línea de comandos

Man » Manual de sh en línea: documentación detallada en línea para la página de manual de sh

🌍
dash — intérprete de comandos (shell)

SINOPSIS

dash     [-aCefnuvxIimqVEbp]    [+aCefnuvxIimqVEbp]    [-o    option_name]    [+o    option_name]
[command_file [argument ...]]
dash -c [-aCefnuvxIimqVEbp] [+aCefnuvxIimqVEbp] [-o option_name] [+o option_name]  command_string
[command_name [argument ...]]
dash -s [-aCefnuvxIimqVEbp] [+aCefnuvxIimqVEbp] [-o option_name] [+o option_name] [argument ...]

DESCRIPCIÓN

dash  es el intérprete de comandos estándar para el sistema. La versión actual de dash está en
proceso de ser modificada para que cumpla con las especificaciones POSIX 1003.2  y  1003.2a  para el
shell.   Esta versión tiene muchas características que la hacen similar en algunos aspectos al shell Korn
shell, pero no es un clon del shell Korn (consulte ksh(1)). Solo se están incorporando las características designadas por POSIX, más
algunas  extensiones  de  Berkeley,  en  este  shell.  Esta  página  de  manual  no  tiene
la intención de ser un tutorial o una especificación completa del shell.

Descripción general

El shell es un comando que lee líneas de un archivo o de la terminal, las interpreta y, generalmente, ejecuta otros comandos. Es el programa que se ejecuta cuando un usuario inicia sesión en el sistema (aunque un usuario puede seleccionar un shell diferente con el comando chsh(1)). El shell implementa un lenguaje que tiene construcciones de control de flujo, una instalación de macros que proporciona una variedad de características además del almacenamiento de datos, junto con capacidades de historial y edición de líneas. Incorpora muchas características para facilitar el uso interactivo y tiene la ventaja de que el lenguaje interpretativo es común tanto para el uso interactivo como no interactivo (scripts de shell). Es decir, los comandos se pueden escribir directamente en el shell en ejecución o se pueden colocar en un archivo y el archivo se puede ejecutar directamente por el shell.

Invocación

Si no hay argumentos presentes y si la entrada estándar del shell está conectada a una terminal (o si se establece la bandera -i), y la opción -c no está presente, el shell se considera un shell interactivo. Un shell interactivo generalmente solicita una entrada antes de cada comando y maneja los errores de programación y de comandos de manera diferente (como se describe a continuación). Cuando se inicia por primera vez, el shell inspecciona el argumento 0, y si comienza con un guion ‘-’, el shell también se considera un shell de inicio de sesión. Esto normalmente lo hace automáticamente el sistema cuando el usuario inicia sesión por primera vez. Un shell de inicio de sesión primero lee los comandos de los archivos /etc/profile y .profile si existen. Si la variable de entorno ENV se establece al entrar en un shell interactivo, o se establece en el archivo .profile de un shell de inicio de sesión, el shell a continuación lee los comandos del archivo cuyo nombre se especifica en ENV. Por lo tanto, un usuario debe colocar los comandos que se deben ejecutar solo al iniciar sesión en el archivo .profile, y los comandos que se ejecutan para cada shell interactivo dentro del archivo ENV. Para establecer la variable ENV en algún archivo, coloque la siguiente línea en su archivo .profile en su directorio de inicio


ENV=$HOME/.shinit; export ENV

sustituyendo “.shinit” por cualquier nombre de archivo que desee.

Si se especifican argumentos de línea de comandos además de las opciones, el shell trata el primer argumento como el nombre de un archivo del que leer comandos (un script de shell) y los argumentos restantes se establecen como los parámetros posicionales del shell ($1, $2, etc.). De lo contrario, el shell lee los comandos desde su entrada estándar.

Procesamiento de la lista de argumentos

Todas las opciones de una sola letra que tienen un nombre correspondiente se pueden utilizar como argumento de la opción -o. El comando set -o nombre se proporciona junto a la opción de una sola letra en la descripción a continuación. Especificar un guion “-” activa la opción, mientras que usar un signo más “+” la desactiva. Las siguientes opciones se pueden establecer desde la línea de comandos o con el comando integrado set (descrito más adelante).

-a allexport     Exportar todas las variables asignadas.

-c               Leer comandos desde el operando command_string en lugar de desde la entrada estándar. El parámetro especial 0 se establecerá a partir del operando command_name y los parámetros posicionales ($1, $2, etc.) se establecerán a partir de los operandos de argumento restantes.

-C noclobber     No sobrescribir los archivos existentes con “>”.

-e errexit       Si no es interactivo, salir inmediatamente si algún comando no probado falla. El estado de salida de un comando se considera que se ha probado explícitamente si el comando se utiliza para controlar un if, elif, while o until; o si el comando es el operando izquierdo de un operador “&&” o “||”.

-f noglob        Desactivar la expansión de nombres de ruta.

-n noexec        Si no es interactivo, leer comandos pero no ejecutarlos. Esto es útil para verificar la sintaxis de los scripts de shell.

-u nounset       Escribir un mensaje en la salida de error estándar al intentar expandir una variable que no está establecida, y si el shell no es interactivo, salir inmediatamente.

-v verbose       El shell escribe su entrada en la salida de error estándar a medida que se lee. Útil para la depuración.

-x xtrace        Escribir cada comando en la salida de error estándar (precedido por un ‘+ ’) antes de que se ejecute. Útil para la depuración.

-I ignoreeof     Ignorar las señales EOF de la entrada cuando es interactivo.

-i interactive   Forzar que el shell se comporte de forma interactiva.

-l               Hacer que dash actúe como si se hubiera invocado como un shell de inicio de sesión.

-m monitor       Activar el control de trabajos (se activa automáticamente cuando es interactivo).

-s stdin         Leer comandos desde la entrada estándar (se activa automáticamente si no hay argumentos de archivo presentes). Esta opción no tiene ningún efecto cuando se establece después de que el shell ya ha comenzado a ejecutarse (es decir, con el comando set).

-V vi            Habilita el editor de línea de comandos vi(1) integrado (desactiva -E si se ha establecido).

-E emacs         Habilita el editor de línea de comandos [emacs](filename:emacs.md)(1) integrado (desactiva -V si se ha establecido).

-b notify        Habilita la notificación asíncrona de la finalización de trabajos en segundo plano. (NO IMPLEMENTADO para 4.4alpha)

-p priviliged    No intente restablecer el ID de usuario efectivo si no coincide con el ID de usuario. Esto no está configurado por defecto para ayudar a evitar un uso incorrecto por programas setuid root a través de system(3) o popen(3).

Estructura Léxica

La shell lee la entrada en términos de líneas de un archivo y la divide en palabras separadas por espacios en blanco (espacios y tabulaciones), y en ciertas secuencias de caracteres que son especiales para la shell, llamadas “operadores”. Hay dos tipos de operadores: operadores de control y operadores de redirección (su significado se analiza más adelante). A continuación se muestra una lista de operadores:

Operadores de control: & && ( ) ; ;; | ||

Operadores de redirección: < > >| << >> <& >& <<- <>

Comillas

Las comillas se utilizan para eliminar el significado especial de ciertos caracteres o palabras para la shell, como operadores, espacios en blanco o palabras clave. Hay tres tipos de comillas: comillas simples coincidentes, comillas dobles coincidentes y barra invertida.

Barra Invertida

Una barra invertida preserva el significado literal del carácter siguiente, con la excepción de ⟨newline⟩. Una barra invertida que precede a ⟨newline⟩ se trata como una continuación de línea.

Comillas Simples

Encerrar caracteres entre comillas simples preserva el significado literal de todos los caracteres (excepto las comillas simples, lo que hace que sea imposible insertar comillas simples en una cadena entre comillas simples).

Comillas Dobles

Encerrar caracteres entre comillas dobles preserva el significado literal de todos los caracteres, excepto el signo de dólar ($), la comilla invertida () y la barra invertida (\). La barra invertida dentro de las comillas dobles es históricamente extraña y sirve para citar solo los siguientes caracteres: $ " \ . De lo contrario, permanece literal.

Palabras Reservadas

Las palabras reservadas son palabras que tienen un significado especial para la shell y se reconocen al principio de una línea y después de un operador de control. Las siguientes son palabras reservadas:

!       elif    fi      while   case
else    for     then    {       }
do      done    until   if      esac

Su significado se analiza más adelante.

Alias

Un alias es un nombre y un valor correspondiente establecidos mediante el comando integrado alias(1). Siempre que una palabra reservada pueda ocurrir (ver arriba), y después de verificar las palabras reservadas, la shell verifica si la palabra coincide con un alias. Si es así, lo reemplaza en la secuencia de entrada por su valor. Por ejemplo, si hay un alias llamado “lf” con el valor “ls -F”, entonces la entrada:

lf foobar ⟨return⟩

se convertiría en

ls -F foobar ⟨return⟩

Los alias proporcionan una forma conveniente para que los usuarios inexpertos creen abreviaturas para comandos sin tener que aprender cómo crear funciones con argumentos. También se pueden utilizar para crear código léxicamente oscuro. Este uso no se recomienda.


Comandos

El intérprete de la shell interpreta las palabras que lee según un lenguaje, cuya especificación está fuera del alcance de esta página de manual (consulte la BNF en el documento POSIX 1003.2). Esencialmente, se lee una línea y, si la primera palabra de la línea (o después de un operador de control) no es una palabra reservada, la shell reconoce un comando simple. De lo contrario, se puede haber reconocido un comando complejo u alguna otra construcción especial.

Comandos simples

Si se ha reconocido un comando simple, la shell realiza las siguientes acciones:

    Las palabras iniciales del formato "nombre=valor" se eliminan y se asignan al entorno del comando simple. Los operadores de redirección y sus argumentos (según se describe a continuación) se eliminan y se guardan para su procesamiento.

    Las palabras restantes se expanden como se describe en la sección denominada "Expansiones", y la primera palabra restante se considera el nombre del comando y se localiza el comando. Las palabras restantes se consideran los argumentos del comando. Si no se obtuvo ningún nombre de comando, entonces las asignaciones de variables "nombre=valor" reconocidas en el elemento 1 afectan a la shell actual.

    Las redirecciones se realizan según se describe en la siguiente sección.

Redirecciones

Las redirecciones se utilizan para cambiar de dónde un comando lee su entrada o a dónde envía su salida. En general, las redirecciones abren, cierran o duplican una referencia existente a un archivo. El formato general utilizado para la redirección es:

[n] redir-op archivo

donde redir-op es uno de los operadores de redirección mencionados anteriormente. A continuación, se muestra una lista de las posibles redirecciones. [n] es un número opcional entre 0 y 9, como en '3' (no '\[3]'), que se refiere a un descriptor de archivo.

[n]> archivo Redirige la salida estándar (o n) al archivo.

[n]>| archivo Igual, pero anula la opción -C.

[n]>> archivo Agrega la salida estándar (o n) al archivo.

[n]< archivo Redirige la entrada estándar (o n) desde el archivo.

[n1]<&n2 Copia el descriptor de archivo n2 como salida estándar (o fd n1). fd n2.

[n]<&- Cierra la entrada estándar (o n).

[n1]>&n2 Copia el descriptor de archivo n2 como entrada estándar (o fd n1). fd n2.

[n]>&- Cierra la salida estándar (o n).

[n]<> archivo Abre el archivo para lectura y escritura en la entrada estándar (o n).

La siguiente redirección se denomina con frecuencia "documento aquí".

[n]<< delimitador
texto-del-documento-aquí ...
delimitador

Todo el texto en las líneas sucesivas hasta el delimitador se guarda y se pone a disposición del comando en la entrada estándar, o en el descriptor de archivo n si se especifica. Si el delimitador especificado en la línea inicial está entre comillas, el texto del documento aquí se trata literalmente; de lo contrario, el texto se somete a la expansión de parámetros, la sustitución de comandos y la expansión aritmética (como se describe en la sección "Expansiones"). Si el operador es " <<- " en lugar de " << ", se eliminan los tabuladores iniciales en el texto del documento aquí.


Búsqueda y ejecución

Existen tres tipos de comandos: funciones de shell, comandos internos y programas normales, y el comando se busca (por nombre) en ese orden. Cada uno se ejecuta de una manera diferente.

Cuando se ejecuta una función de shell, todos los parámetros posicionales del shell (excepto $0, que permanece sin cambios) se establecen en los argumentos de la función de shell. Las variables que se colocan explícitamente en el entorno del comando (mediante la colocación de asignaciones a ellas antes del nombre de la función) se hacen locales a la función y se establecen en los valores dados. Luego, se ejecuta el comando dado en la definición de la función. Los parámetros posicionales se restauran a sus valores originales cuando el comando se completa. Todo esto ocurre dentro del shell actual.

Los comandos internos del shell se ejecutan internamente en el shell, sin generar un nuevo proceso.

De lo contrario, si el nombre del comando no coincide con una función o un comando interno, el comando se busca como un programa normal en el sistema de archivos (como se describe en la siguiente sección). Cuando se ejecuta un programa normal, el shell ejecuta el programa, pasando los argumentos y el entorno al programa. Si el programa no es un archivo ejecutable normal (es decir, si no comienza con el "número mágico" cuya representación ASCII es "#!", por lo que execve(2) devuelve ENOEXEC), el shell interpretará el programa en un subshell. El subshell se reinicializará en este caso, por lo que el efecto será como si se hubiera invocado un nuevo shell para manejar el script de shell ad hoc, excepto que la ubicación de los comandos almacenados en caché en el shell padre será recordada por el subshell.

Tenga en cuenta que las versiones anteriores de este documento y el propio código fuente se refieren de forma engañosa y esporádica a un script de shell sin un número mágico como un "procedimiento de shell".

Búsqueda de ruta

Cuando se localiza un comando, el shell primero verifica si tiene una función de shell con ese nombre. Luego, busca un comando interno con ese nombre. Si no se encuentra un comando interno, ocurren dos cosas:

Los nombres de los comandos que contienen una barra se ejecutan simplemente sin realizar ninguna búsqueda.

El shell busca en cada entrada de PATH a su vez el comando. El valor de la variable PATH debe ser una serie de entradas separadas por dos puntos. Cada entrada consta de un nombre de directorio. El directorio actual se puede indicar implícitamente mediante un nombre de directorio vacío o explícitamente mediante un solo punto.

Estado de salida del comando

Cada comando tiene un estado de salida que puede influir en el comportamiento de otros comandos del shell. El paradigma es que un comando sale con cero para indicar normalidad o éxito, y distinto de cero para indicar un error o una indicación falsa. La página de manual de cada comando debe indicar los diversos códigos de salida y su significado. Además, los comandos internos devuelven códigos de salida, al igual que una función de shell ejecutada.


Si un comando consiste enteramente en asignaciones de variables, el estado de salida del comando es el del último comando de sustitución, si lo hay; de lo contrario, es 0.

Comandos complejos

Los comandos complejos son combinaciones de comandos simples con operadores de control o palabras reservadas, que juntos crean un comando complejo más grande. En términos generales, un comando es uno de los siguientes:

comando simple

tubería

lista o lista de compuestos

comando compuesto

definición de función

A menos que se indique lo contrario, el estado de salida de un comando es el del último comando simple ejecutado por el comando.

Tuberías

Una tubería es una secuencia de uno o más comandos separados por el operador de control |. La salida estándar de todos los comandos, excepto el último, se conecta a la entrada estándar del siguiente comando. La salida estándar del último comando se hereda de la shell, como de costumbre.

El formato para una tubería es:

[!] comando1 [| comando2 ...]

La salida estándar de comando1 se conecta a la entrada estándar de comando2. La entrada estándar, la salida estándar o ambas de un comando se consideran asignadas por la tubería antes de cualquier redirección especificada por los operadores de redirección que forman parte del comando.

Si la tubería no está en segundo plano (se analiza más adelante), la shell espera a que todos los comandos se completen.

Si la opción pipefail estaba habilitada cuando la shell comenzó la ejecución de la tubería, el estado de salida de la tubería es el estado de salida del último comando especificado en la tubería que finalizó con un estado distinto de cero, o cero si todos los comandos de la tubería finalizó con un estado de cero. Si la opción pipefail no estaba habilitada, el estado de salida de la tubería es el estado de salida del último comando especificado en la tubería; los estados de salida de cualquier otro comando no se utilizan. Si la palabra reservada ! precede a la tubería, su estado de salida es el negado lógico del estado de salida descrito anteriormente.

Debido a que la asignación de la entrada estándar o la salida estándar, o ambas, de la tubería se produce antes de la redirección, se puede modificar mediante la redirección. Por ejemplo:

$ comando1 2>&1 | comando2

envía tanto la salida estándar como el error estándar de comando1 a la entrada estándar de comando2.

Un terminador `;` o `⟨newline⟩` hace que la lista AND-OR precedente (descrita a continuación) se ejecute secuencialmente; un `&` hace que la lista AND-OR precedente se ejecute de forma asíncrona.

Tenga en cuenta que, a diferencia de otras shells, cada proceso de la tubería es un hijo de la shell que lo invoca (a menos que sea un builtin de la shell, en cuyo caso se ejecuta en la shell actual, pero cualquier efecto que tenga en el entorno se elimina).

Comandos en segundo plano – &

Si un comando termina con el operador de control ampersand (&), la shell ejecuta el comando de forma asíncrona; es decir, la shell no espera a que el comando finalice antes de ejecutar el siguiente comando.

El formato para ejecutar un comando en segundo plano es:


comando1 & [comando2 & ...]

Si el shell no es interactivo, la entrada estándar de un comando asíncrono se establece en /dev/null.

Listas – En general

Una lista es una secuencia de cero o más comandos separados por saltos de línea, puntos y comas o ampersands, y terminados opcionalmente por uno de estos tres caracteres. Los comandos en una lista se ejecutan en el orden en que están escritos. Si a un comando le sigue un ampersand, el shell inicia el comando y procede inmediatamente al siguiente comando; de lo contrario, espera a que el comando termine antes de continuar con el siguiente.

Operadores de lista de cortocircuito

“&&” y “||” son operadores de lista AND-OR. “&&” ejecuta el primer comando y, a continuación, ejecuta el segundo comando solo si el estado de salida del primer comando es cero. “||” es similar, pero ejecuta el segundo comando solo si el estado de salida del primer comando es distinto de cero. Tanto “&&” como “||” tienen la misma prioridad.

Constructos de control de flujo: if, while, for, case

La sintaxis del comando if es

if lista
then lista
[ elif lista
then lista ] ...
[ else lista ]
fi

La sintaxis del comando while es

while lista
do lista
done

Las dos listas se ejecutan repetidamente mientras el estado de salida de la primera lista sea cero. El comando until es similar, pero tiene la palabra until en lugar de while, lo que hace que se repita hasta que el estado de salida de la primera lista sea cero.

La sintaxis del comando for es

for variable [ in [ palabra ... ] ]
do lista
done

Las palabras que siguen a in se expanden y, a continuación, la lista se ejecuta repetidamente con la variable establecida en cada palabra a su vez. Omitir in palabra ... es equivalente a in "$@".

La sintaxis de los comandos break y continue es

break [ número ]
continue [ número ]

Break termina los bucles for o while más internos, que especifica el número. Continue continúa con la siguiente iteración del bucle más interno. Estos se implementan como comandos integrados.

La sintaxis del comando case es

case palabra en
[(]patrón) lista ;;
...
esac

El patrón puede ser en realidad uno o más patrones (véase “Patrones de shell” que se describe más adelante), separados por caracteres “|”. El carácter “(” que precede al patrón es opcional.

Agrupación de comandos

Los comandos se pueden agrupar escribiendo

(lista)

o

{ lista; }

La primera de estas ejecuta los comandos en un subshell. Los comandos integrados agrupados en (lista) no afectarán al shell actual. La segunda forma no bifurca otro shell, por lo que es ligeramente más eficiente. La agrupación de comandos de esta manera permite redirigir su salida como si fueran un solo programa:

{ printf " hello " ; printf " world\n" ; } > greeting

Tenga en cuenta que “}” debe seguir a un operador de control (aquí, “;”) para que se reconozca como una palabra reservada y no como otro argumento del comando.

Funciones

La sintaxis de una definición de función es

nombre () comando

Una definición de función es una instrucción ejecutable; cuando se ejecuta, instala una función con el nombre nombre y devuelve un estado de salida cero. El comando es normalmente una lista encerrada entre “{” y “}”.

Las variables pueden declararse como locales a una función mediante el comando local. Esto debe aparecer como la primera instrucción de una función, y la sintaxis es:

local [variable | -] ...

^ ocal se implementa como un comando integrado.

Cuando una variable se vuelve local, hereda el valor inicial y las marcas de exportación y solo lectura de la variable con el mismo nombre en el ámbito circundante, si existe. De lo contrario, la variable se establece inicialmente como no definida. El shell utiliza un ámbito dinámico, por lo que si hace que la variable x sea local a la función f, que luego llama a la función g, las referencias a la variable x que se realicen dentro de g se referirán a la variable x declarada dentro de f, y no a la variable global con el nombre x.

El único parámetro especial que se puede hacer local es "-". Hacer que "-" sea local hará que cualquier opción del shell que se cambie mediante el comando set dentro de la función se restaure a sus valores originales cuando la función regrese.

La sintaxis del comando return es:

return [exitstatus]

Termina la función que se está ejecutando actualmente. Return se implementa como un comando integrado.

Variables y parámetros

El shell mantiene un conjunto de parámetros. Un parámetro denotado por un nombre se denomina variable. Al iniciarse, el shell convierte todas las variables de entorno en variables del shell. Se pueden establecer nuevas variables utilizando el formato:

name=value

Las variables establecidas por el usuario deben tener un nombre que consista únicamente en letras, números y guiones bajos, cuyo primero no debe ser un número. Un parámetro también puede denotarse por un número o un carácter especial, como se explica a continuación.

Parámetros posicionales

Un parámetro posicional es un parámetro denotado por un número (n > 0). El shell los establece inicialmente con los valores de los argumentos de la línea de comandos que siguen al nombre del script del shell. El comando integrado set también se puede utilizar para establecerlos o restablecerlos.

Parámetros especiales

Un parámetro especial es un parámetro denotado por uno de los siguientes caracteres especiales. El valor del parámetro se enumera junto con su carácter.

*            Se expande a los parámetros posicionales, comenzando desde uno. Cuando la expansión se produce dentro de una cadena entre comillas dobles, se expande a un solo campo con el valor de cada parámetro separado por el primer carácter de la variable `IFS`, o por un espacio en blanco si `IFS` no está definida.

@            Se expande a los parámetros posicionales, comenzando desde uno. Cuando la expansión se produce dentro de comillas dobles, cada parámetro posicional se expande como un argumento independiente. Si no hay parámetros posicionales, la expansión de `@` genera cero argumentos, incluso cuando `@` está entre comillas dobles. Básicamente, esto significa que, por ejemplo, si `$1` es "abc" y `$2` es "def ghi", entonces `"$@"` se expande a los dos argumentos:

"abc" "def ghi"

#            Se expande al número de parámetros posicionales.

? Expande al estado de salida del pipeline más reciente.

- (Guión). Expande los indicadores de opción actuales (los nombres de opción de una sola letra concatenados
en una cadena) según se especifique en la invocación, mediante el comando `set` o implícitamente
por el shell.

$ Expande al ID de proceso del shell invocado. Un subshell conserva el mismo valor de $ que su proceso padre.

! Expande al ID de proceso del comando de fondo más reciente ejecutado desde el shell actual. Para un pipeline, el ID de proceso es el del último comando en el
pipeline.

0 (Cero). Expande al nombre del shell o script de shell.

Expansiones de palabras

Esta cláusula describe las diversas expansiones que se realizan en las palabras. No todas las expansiones se realizan en todas las palabras, como se explica más adelante.

Las expansiones de tilde, las expansiones de parámetros, las sustituciones de comandos, las expansiones aritméticas y las eliminaciones de comillas que ocurren dentro de una sola palabra se expanden a un solo campo. Solo la división de campos o la expansión de nombres de ruta pueden crear varios campos a partir de una sola palabra. La única excepción a esta regla es la expansión del parámetro especial @ dentro de comillas dobles, como se describió anteriormente.

El orden de la expansión de palabras es:

     Expansión de tilde, Expansión de parámetros, Sustitución de comandos, Expansión aritmética (estas se producen al mismo tiempo).

     La división de campos se realiza en los campos generados en el paso (1), a menos que la variable IFS sea nula.

     Expansión de nombres de ruta (a menos que `set -f` esté en efecto).

     Eliminación de comillas.

El carácter $ se utiliza para introducir la expansión de parámetros, la sustitución de comandos o la evaluación aritmética.

Expansión de tilde (sustitución del directorio de inicio de un usuario)

Una palabra que comienza con un carácter de tilde sin comillas (~) se somete a la expansión de tilde. Todos los caracteres hasta una barra diagonal (/) o el final de la palabra se tratan como un nombre de usuario y se reemplazan con el directorio de inicio del usuario. Si falta el nombre de usuario (como en ~/foobar), la tilde se reemplaza con el valor de la variable HOME (el directorio de inicio del usuario actual).

Expansión de parámetros

El formato para la expansión de parámetros es el siguiente:

${expresión}

donde expresión consiste en todos los caracteres hasta la “}coincidente. Cualquier “} que esté escapada con una barra diagonal invertida o dentro de una cadena entre comillas, y los caracteres en las expansiones aritméticas, sustituciones de comandos y expansiones de variables integradas, no se examinan al determinar la “}` coincidente.

La forma más simple para la expansión de parámetros es:

${parámetro}

El valor, si lo hay, del parámetro se sustituye.

El nombre o símbolo del parámetro se puede encerrar entre llaves, lo que es opcional, excepto para los parámetros de posición con más de un dígito o cuando el parámetro es seguido por un carácter que podría interpretarse como parte del nombre. Si se produce una expansión de parámetros dentro de comillas dobles:

     No se realiza la expansión de nombres de ruta en los resultados de la expansión.

      La división de campos no se realiza en los resultados de la expansión, con la excepción de @.

Además, una expansión de parámetro se puede modificar utilizando uno de los siguientes formatos.

${parameter:-word}    Usar valores predeterminados. Si el parámetro no está establecido o es nulo, se sustituye la expansión de la palabra; de lo contrario, se sustituye el valor del parámetro.

${parameter:=word}    Asignar valores predeterminados. Si el parámetro no está establecido o es nulo, la expansión de la palabra se asigna al parámetro. En todos los casos, el valor final del parámetro se sustituye. Solo las variables, no los parámetros posicionales ni los parámetros especiales, se pueden asignar de esta manera.

${parameter:?[word]}  Indicar error si es nulo o no está establecido. Si el parámetro no está establecido o es nulo, la expansión de la palabra (o un mensaje que indica que no está establecido si se omite la palabra) se escribe en la salida de error estándar y el shell sale con un estado de salida distinto de cero. De lo contrario, se sustituye el valor del parámetro. Un shell interactivo no tiene por qué salir.

${parameter:+word}    Usar valor alternativo. Si el parámetro no está establecido o es nulo, se sustituye nulo; de lo contrario, se sustituye la expansión de la palabra.

En las expansiones de parámetros que se muestran anteriormente, el uso de los dos puntos en el formato da como resultado una prueba de un parámetro que no está establecido o es nulo; la omisión de los dos puntos da como resultado una prueba de un parámetro que solo no está establecido.

${#parameter}         Longitud de la cadena. La longitud en caracteres del valor del parámetro.

Las siguientes cuatro variantes de la expansión de parámetros proporcionan el procesamiento de subcadenas. En cada caso, la notación de coincidencia de patrones (consulte "Patrones de shell"), en lugar de la notación de expresiones regulares, se utiliza para evaluar los patrones. Si el parámetro es * o @, el resultado de la expansión no está especificado. Encerrar toda la cadena de expansión de parámetros entre comillas dobles no hace que los siguientes cuatro caracteres de patrón se citen, mientras que la cita de caracteres dentro de las llaves tiene este efecto.

${parameter%word}     Eliminar el sufijo de patrón más pequeño. La palabra se expande para producir un patrón. La expansión del parámetro da como resultado el parámetro, con la parte más pequeña del sufijo que coincide con el patrón eliminada.

${parameter%%word}    Eliminar el sufijo de patrón más grande. La palabra se expande para producir un patrón. La expansión del parámetro da como resultado el parámetro, con la parte más grande del sufijo que coincide con el patrón eliminada.

${parameter#word}     Eliminar el prefijo de patrón más pequeño. La palabra se expande para producir un patrón. La expansión del parámetro da como resultado el parámetro, con la parte más pequeña del prefijo que coincide con el patrón eliminada.

${parameter##word}    Eliminar el prefijo de patrón más grande. La palabra se expande para producir un patrón. La expansión del parámetro da como resultado el parámetro, con la parte más grande del prefijo que coincide con el patrón eliminada.

Sustitución de comandos

La sustitución de comandos permite que la salida de un comando se sustituya en lugar del propio nombre del comando. La sustitución de comandos se produce cuando el comando está encerrado de la siguiente manera:


$(comando)

o (versión entre comillas invertidas):

`comando`

El shell expande la sustitución de comandos ejecutando el comando en un entorno de subshell y reemplazando la sustitución de comandos con la salida estándar del comando, eliminando las secuencias de una o más ⟨nueva línea⟩ al final de la sustitución. (Las ⟨nueva línea⟩ incrustadas antes del final de la salida no se eliminan; sin embargo, durante la división de campos, pueden traducirse en ⟨espacio⟩, dependiendo del valor de IFS y las comillas que estén en efecto).

Expansión aritmética

La expansión aritmética proporciona un mecanismo para evaluar una expresión aritmética y sustituir su valor. El formato para la expansión aritmética es el siguiente:

$((expresión))

La expresión se trata como si estuviera entre comillas dobles, excepto que una comilla doble dentro de la expresión no se trata de forma especial. El shell expande todos los tokens en la expresión para la expansión de parámetros, la sustitución de comandos y la eliminación de comillas.

A continuación, el shell trata esto como una expresión aritmética y sustituye el valor de la expresión.

División de espacios en blanco (división de campos)

Después de la expansión de parámetros, la sustitución de comandos y la expansión aritmética, el shell analiza los resultados de las expansiones y sustituciones que no se produjeron entre comillas dobles para la división de campos y se pueden generar varios campos.

El shell trata cada carácter de IFS como un delimitador y utiliza los delimitadores para dividir los resultados de la expansión de parámetros y la sustitución de comandos en campos.

Expansión de nombres de ruta (generación de nombres de archivo)

A menos que se establezca la bandera -f, la generación de nombres de archivo se realiza después de que se completa la división de palabras. Cada palabra se considera una serie de patrones separados por barras diagonales. El proceso de expansión reemplaza la palabra con los nombres de todos los archivos existentes cuyos nombres se pueden formar reemplazando cada patrón con una cadena que coincida con el patrón especificado. Existen dos restricciones para esto: en primer lugar, un patrón no puede coincidir con una cadena que contenga una barra diagonal y, en segundo lugar, un patrón no puede coincidir con una cadena que comience con un punto a menos que el primer carácter del patrón sea un punto. La siguiente sección describe los patrones que se utilizan tanto para la expansión de nombres de ruta como para el comando case.

Patrones de shell

Un patrón consta de caracteres normales, que coinciden consigo mismos, y metacaracteres. Los metacaracteres son “!”, “*”, “?”, y “[”. Estos caracteres pierden sus significados especiales si están entre comillas. Cuando se realiza la sustitución de comandos o variables y el signo de dólar o las comillas invertidas no están entre comillas dobles, el valor de la variable o la salida del comando se escanean en busca de estos caracteres y se convierten en metacaracteres.

Un asterisco (“*”) coincide con cualquier cadena de caracteres. Un signo de interrogación coincide con cualquier carácter único. Un corchete izquierdo (“[”) introduce una clase de caracteres. El final de la clase de caracteres se indica con un corchete derecho (“]”); si falta el “]”, entonces el “[” coincide con un “[” en lugar de introducir una clase de caracteres. Una clase de caracteres coincide con cualquiera de los caracteres entre los corchetes. Se puede especificar un rango de caracteres utilizando un guion. La clase de caracteres se puede complementar haciendo que un signo de exclamación sea el primer carácter de la clase de caracteres.


Para incluir un “]” en una clase de caracteres, conviértalo en el primer carácter que se enumera (después del “!”, si lo hay). Para incluir un signo menos, conviértalo en el primer o último carácter que se enumera.

Comandos integrados

Esta sección enumera los comandos integrados, que son integrados porque necesitan realizar alguna operación que no se puede realizar mediante un proceso separado. Además de estos, existen varios otros comandos que pueden ser integrados por motivos de eficiencia (por ejemplo, printf(1), echo(1), test(1), etc.).

:

true Un comando nulo que devuelve un valor de salida de 0 (verdadero).

false Un comando nulo que devuelve un valor de salida de 1 (falso).

. file

Los comandos del archivo especificado se leen y se ejecutan mediante el shell.

alias [nombre[=cadena ...]]

Si se especifica nombre=cadena, el shell define el alias nombre con el valor cadena. Si solo se especifica nombre, se imprime el valor del alias nombre. Sin argumentos, el comando alias integrado imprime los nombres y valores de todos los alias definidos (vea unalias).

bg [trabajo] ...

Continúa los trabajos especificados (o el trabajo actual si no se especifican trabajos) en segundo plano.

command [-p] [-v] [-V] comando [arg ...]

Ejecuta el comando especificado, pero ignora las funciones del shell al buscarlo. (Esto es útil cuando tiene una función del shell con el mismo nombre que un comando integrado).

-p Busca el comando utilizando un PATH que garantiza que se encuentren todas las utilidades estándar.

-V No ejecuta el comando, sino que busca el comando e imprime la resolución de la búsqueda del comando. Esto es lo mismo que el comando type.

-v No ejecuta el comando, sino que busca el comando e imprime la ruta absoluta de las utilidades, el nombre de los comandos integrados o la expansión de los alias.

cd|chdir cd|chdir [-LP] [directorio]

Cambia al directorio especificado (predeterminado HOME). Si una entrada para CDPATH aparece en el entorno del comando cd o la variable de shell CDPATH está establecida y el nombre del directorio no comienza con una barra diagonal, entonces los directorios que se enumeran en CDPATH se buscarán para el directorio especificado. El formato de CDPATH es el mismo que el de PATH. Si se especifica un solo guión como argumento, se reemplazará por el valor de OLDPWD. El comando cd imprimirá el nombre del directorio al que realmente cambió si esto es diferente del nombre que proporcionó el usuario. Estos pueden ser diferentes porque se utilizó el mecanismo CDPATH o porque el argumento es un solo guión. La opción -P hace que se utilice la estructura de directorio física, es decir, todos los enlaces simbólicos se resuelven a sus respectivos valores. La opción -L desactiva el efecto de cualquier opción -P anterior.


echo [-n] args...

Imprime los argumentos en la salida estándar, separados por espacios. A menos que se presente la opción -n, se imprime una nueva línea después de los argumentos.

Si se encuentra alguna de las siguientes secuencias de caracteres durante la salida, la secuencia no se imprime. En cambio, se realiza la acción especificada:

\b      Se imprime un carácter de retroceso.

\c      La salida posterior se suprime. Esto normalmente se usa al final del último argumento para suprimir la nueva línea final que `echo` imprimiría de otro modo.

\e      Imprime un carácter de escape (ESC).

\f      Imprime un salto de página.

\n      Imprime un carácter de nueva línea.

\r      Imprime un retorno de carro.

\t      Imprime un carácter de tabulación (horizontal).

\v      Imprime una tabulación vertical.

\0digits

Imprime el carácter cuyo valor está dado por cero a tres dígitos octales. Si no hay dígitos, se imprime un carácter nulo.

\\      Imprime una barra invertida.

Todas las demás secuencias de barra invertida producen un comportamiento indefinido.

eval string ...

Concatena todos los argumentos con espacios. Luego, vuelve a analizar y ejecutar el comando.

exec [comando arg ...]

A menos que se omita el comando, el proceso de shell se reemplaza con el programa especificado (que debe ser un programa real, no una función integrada o un comando integrado del shell). Cualquier redirección en el comando exec se marca como permanente, de modo que no se deshace cuando finaliza el comando exec.

exit [estado_salida]

Termina el proceso de shell. Si se proporciona estado\_salida, se usa como el estado de salida del shell; de lo contrario, se utiliza el estado de salida del comando anterior.

export name ...

export -p

Los nombres especificados se exportan para que aparezcan en el entorno de los comandos posteriores. La única forma de dejar de exportar una variable es eliminarla. El shell permite establecer el valor de una variable al mismo tiempo que se exporta escribiendo

export name=value

Sin argumentos, el comando export enumera los nombres de todas las variables exportadas. Con la opción -p especificada, la salida se formatea de manera adecuada para uso no interactivo.

fc [-e editor] [primero [último]]

fc -l [-nr] [primero [último]]

fc -s [viejo=nuevo] [primero]

El comando integrado fc enumera, o edita y vuelve a ejecutar, comandos ingresados ​​anteriormente en un shell interactivo.

-e editor

Utilice el editor especificado por editor para editar los comandos. La cadena editor es un nombre de comando, sujeto a la búsqueda a través de la variable PATH. El valor en la variable FCEDIT se utiliza como valor predeterminado cuando no se especifica -e. Si FCEDIT es nula o no está definida, se utiliza el valor de la variable EDITOR. Si EDITOR es nula o no está definida, se utiliza ed(1) como editor.

-l (ell)

Enumere los comandos en lugar de invocar un editor en ellos. Los comandos se escriben en la secuencia indicada por los operandos primero y último, según lo afectado por -r, y cada comando va precedido del número de comando.


-n     Suprime los números de comando al listar con -l.

-r     Invierte el orden de los comandos listados (con -l) o editados (ni con -l ni con
-s).

-s     Reejecuta el comando sin invocar un editor.

first

last   Selecciona los comandos para listar o editar. El número de comandos anteriores a los que se puede
acceder se determina mediante el valor de la variable HISTSIZE. El valor de first
o last o ambos es uno de los siguientes:

[+]número
Un número positivo que representa un número de comando; los números de comando se pueden mostrar con la opción -l.

-número
Un número decimal negativo que representa el comando que se ejecutó hace número
de comandos. Por ejemplo, -1 es el comando inmediatamente anterior.

cadena
Una cadena que indica el comando ingresado más recientemente que comienza con esa cadena.

Si el operando antiguo=nuevo no se especifica también con -s, la forma de cadena del operando first no puede contener un signo de igual.

Las siguientes variables de entorno afectan la ejecución de fc:

FCEDIT    Nombre del editor que se utilizará.

HISTSIZE  El número de comandos anteriores a los que se puede acceder.

fg [job]

Mueve el trabajo especificado o el trabajo actual al primer plano.

getopts optstring var [arg ...]

El comando POSIX getopts, que no debe confundirse con la utilidad derivada de Bell Labs, getopt(1).

El primer argumento debe ser una serie de letras, cada una de las cuales puede ir seguida opcionalmente por dos puntos para indicar que la opción requiere un argumento. La variable especificada se establece en la opción analizada.

El comando getopts desaconseja la utilidad anterior getopt(1) debido a su manejo de los argumentos que contienen espacios en blanco.

El comando interno getopts se puede utilizar para obtener opciones y sus argumentos de una lista de parámetros. Cuando se invoca, getopts coloca el valor de la siguiente opción de la cadena de opciones en la lista en la variable de shell especificada por var y su índice en la variable de shell OPTIND. Cuando se invoca el shell, OPTIND se inicializa en 1. Para cada opción que requiere un argumento, el comando interno getopts lo colocará en la variable de shell OPTARG. Si una opción no está permitida en la cadena de opciones, entonces OPTARG se eliminará.

Por defecto, las variables $1, ..., $n se inspeccionan; si se especifican argumentos, se analizarán en su lugar.

optstring es una cadena de letras de opciones reconocidas (consulte getopt(3)). Si una letra va seguida de dos puntos, se espera que la opción tenga un argumento que puede estar o no separado de ella por espacios en blanco. Si no se encuentra un carácter de opción donde se esperaba, getopts establecerá la variable var en un “?”; getopts luego eliminará OPTARG y escribirá la salida a la salida estándar de error. Al especificar dos puntos como el primer carácter de optstring, se ignorarán todos los errores.

Después de la última opción, getopts devolverá un valor distinto de cero y establecerá var en “?”.

El siguiente fragmento de código muestra cómo se podría procesar los argumentos de un comando que
puede tomar las opciones [a] y [b], y la opción [c], que requiere un argumento.

while getopts abc: f
do
case $f in
a | b)  flag=$f;;
c)      carg=$OPTARG;;
\?)     echo $USAGE; exit 1;;
esac
done
shift $((OPTIND - 1))

Este código aceptará cualquiera de los siguientes como equivalentes:

cmd -acarg archivo archivo
cmd -a -c arg archivo archivo
cmd -carg -a archivo archivo
cmd -a -carg -- archivo archivo

hash [comando ...]

hash -r

El shell mantiene una tabla hash que recuerda las ubicaciones de los comandos. Sin argumentos, el comando hash imprime el contenido de esta tabla. Las entradas que no se han consultado desde el último comando cd están marcadas con un asterisco; es posible que estas entradas no sean válidas.

Con argumentos, el comando hash elimina los comandos especificados de la tabla hash (a menos que sean funciones) y luego los localiza. La opción -r hace que el comando hash elimine todas las entradas de la tabla hash, excepto las funciones.

jobs [-lp] [trabajo ...]

Muestra el estado de todos los trabajos o solo de los especificados: Por defecto, muestra el número de trabajo, el estado actual (+/-), si corresponde, el estado del trabajo y su comando shell. -l también muestra el PID del líder del grupo y solo el PID y los comandos shell de los demás miembros del trabajo. -p Muestra solo los PID del líder, uno por línea.

kill [-s sigspec | -signum | -sigspec] [pid | trabajo ...]

Equivalente a kill(1), pero también se puede especificar una especificación de trabajo. Las señales pueden ser nombres sin el prefijo SIG, o números decimales; el valor predeterminado es TERM.

kill -l [signum | exitstatus]

Muestra los nombres de las señales disponibles sin el prefijo SIG. Si se especifica signum, muestra solo la sigspec para esa señal. Si se especifica exitstatus (> 128), muestra solo la sigspec que lo causó.

pwd [-LP]
comando incorporado que recuerda cuál es el directorio actual en lugar de volver a calcularlo cada vez. Esto lo hace más rápido. Sin embargo, si se cambia el nombre del directorio actual, la versión incorporada de pwd seguirá mostrando el nombre antiguo del directorio. La opción -P hace que se muestre el valor físico del directorio de trabajo actual, es decir, todos los enlaces simbólicos se resuelven a sus respectivos valores. La opción -L deshace el efecto de cualquier opción -P anterior.

read [-p prompt] [-r] variable [...]

El mensaje se muestra si se especifica la opción -p y la entrada estándar es una terminal. Luego, se lee una línea de la entrada estándar. El carácter de nueva línea final se elimina de la línea y la línea se divide según lo descrito en la sección sobre la división de palabras anterior, y las partes se asignan a las variables en orden. Debe especificarse al menos una variable. Si hay más partes que variables, las partes restantes (junto con los caracteres en IFS que las separaban) se asignan a la última variable. Si hay más variables que partes, las variables restantes se asignan a la cadena nula. El comando incorporado read indicará éxito a menos que se encuentre EOF en la entrada, en cuyo caso se devolverá un error.


Por defecto, a menos que se especifique la opción -r, la barra invertida “\” actúa como un carácter de escape, lo que hace que el carácter siguiente se trate literalmente. Si a una barra invertida le sigue un salto de línea, la barra invertida y el salto de línea se eliminarán.

readonly name ...

readonly -p

Los nombres especificados se marcan como de solo lectura, de modo que no se puedan modificar ni eliminar posteriormente. El shell permite establecer el valor de una variable al mismo tiempo que se marca como de solo lectura escribiendo:

readonly name=value

Sin argumentos, el comando readonly enumera los nombres de todas las variables de solo lectura. Con la opción -p especificada, la salida se formateará de forma adecuada para su uso no interactivo.

printf format [value]...

printf formatea e imprime sus argumentos según el formato, una cadena de caracteres que contiene tres tipos de objetos: caracteres simples, que simplemente se copian en la salida estándar, secuencias de escape de caracteres que se convierten y se copian en la salida estándar, y especificaciones de formato, cada una de las cuales provoca la impresión del siguiente valor.

Cada valor se trata como una cadena si la especificación de formato correspondiente es b, c o s; de lo contrario, se evalúa como una constante de C, con las siguientes adiciones: Se permite un signo más o menos inicial. Si el carácter inicial es una comilla simple o doble, el valor del siguiente byte.

La cadena de formato se reutiliza tantas veces como sea necesario hasta que se consumen todos los valores. Cualquier especificación de formato adicional se evalúa con cero o la cadena nula.

Las secuencias de escape de caracteres están en notación de barra invertida, como se define en ANSI X3.159-1989 (“ANSI C89”). Los caracteres y sus significados son los siguientes:

\a      Escribe un carácter <campana>.

\b      Escribe un carácter <retroceso>.

\e      Escribe un carácter <escape> (ESC).

\f      Escribe un carácter <salto de página>.

\n      Escribe un carácter <salto de línea>.

\r      Escribe un carácter <retorno de carro>.

\t      Escribe un carácter <tabulador>.

\v      Escribe un carácter <tabulador vertical>.

\\      Escribe un carácter de barra invertida.

\num    Escribe un carácter de 8 bits cuyo valor ASCII es el número octal de 1, 2 o 3 dígitos num.

Cada especificación de formato se introduce mediante el carácter de porcentaje (``%''). El resto de la especificación de formato incluye, en el orden siguiente:

Cero o más de las siguientes marcas:

#       Un carácter `#' que especifica que el valor debe imprimirse en una forma ``alternativa''. Para los formatos b, c, d y s, esta opción no tiene ningún efecto.

Para el formato o, la precisión del número aumenta para forzar a que el primer carácter de la cadena de salida sea un cero. Para el formato x (X), un resultado distinto de cero tiene la cadena 0x (0X) añadida al principio. Para los formatos e, E, f, g y G, el resultado siempre contendrá un punto decimal, incluso si no hay dígitos después del punto (normalmente, un punto decimal solo aparece en los resultados de esos formatos si hay un dígito después del punto decimal). Para los formatos g y G, los ceros finales no se eliminan del resultado como lo harían de otro modo.


-       Un signo menos `-' que especifica la alineación izquierda de la salida en el campo indicado;

+       Un carácter `+' que especifica que siempre debe colocarse un signo antes del número cuando se utilizan formatos con signo.

‘ ’     Un espacio que especifica que se debe dejar un espacio en blanco antes de un número positivo para un formato con signo. Un `+' anula un espacio si ambos se utilizan;

0      Un cero `0' que indica que se debe utilizar el relleno con ceros en lugar del relleno con espacios. Un `-' anula un `0' si ambos se utilizan;

Ancho de campo: Una cadena de dígitos opcional que especifica un ancho de campo; si la cadena de salida tiene menos caracteres que el ancho de campo, se rellenará con espacios en blanco a la izquierda (o a la derecha, si se ha especificado el indicador de alineación izquierda) para completar el ancho de campo (tenga en cuenta que un cero inicial es una marca, pero un cero incrustado forma parte de un ancho de campo);

Precisión:

Un punto opcional, ‘.’, seguido de una cadena de dígitos opcional que proporciona una precisión, que especifica el número de dígitos que deben aparecer después del punto decimal, para los formatos e y f, o el número máximo de bytes que se van a imprimir de una cadena (formatos b y s); si falta la cadena de dígitos, la precisión se trata como cero;

Formato:

Un carácter que indica el tipo de formato que se va a utilizar (uno de diouxXfwEgGbcs).

Un ancho de campo o una precisión pueden ser ‘*’ en lugar de una cadena de dígitos. En este caso, un argumento proporciona el ancho de campo o la precisión.

Los caracteres de formato y sus significados son:

diouXx      El argumento se imprime como un decimal con signo (d o i), octal sin signo, decimal sin signo o hexadecimal sin signo (X o x), respectivamente.

f           El argumento se imprime en el estilo [-]ddd.ddd donde el número de d después del punto decimal es igual a la especificación de precisión del argumento. Si falta la precisión, se muestran 6 dígitos; si la precisión se especifica explícitamente como 0, no se imprimen dígitos ni punto decimal.

eE          El argumento se imprime en el estilo [-]d.ddde±dd donde hay un dígito antes del punto decimal y el número que sigue es igual a la especificación de precisión del argumento; cuando falta la precisión, se producen 6 dígitos. Se utiliza una E mayúscula para un formato 'E'.

gG          El argumento se imprime en el estilo f o en el estilo e (E), lo que proporcione la máxima precisión en el menor espacio.

b           Los caracteres de la cadena de argumentos se imprimen con las secuencias de escape con barra invertida expandidas. Se admiten las siguientes secuencias de escape con barra invertida adicionales:

\c      Hace que dash ignore los caracteres restantes en la cadena de operandos que la contengan, cualquier operando de cadena restante y cualquier carácter adicional en el operando de formato.

\0num   Escribe un carácter de 8 bits cuyo valor ASCII es el número octal de 1, 2 o 3 dígitos num.

c           Se imprime el primer carácter del argumento.

s           Se imprimen los caracteres de la cadena de argumento hasta que se alcanza el final o hasta que se alcanza el número de bytes indicado por la especificación de precisión; si se omite la precisión, se imprimen todos los caracteres de la cadena.

%           Imprime un '%'; no se utiliza ningún argumento.

En ningún caso, un ancho de campo inexistente o pequeño provoca la truncación de un campo; el relleno solo se produce si el ancho de campo especificado excede el ancho real.

set [{ -opciones | +opciones | -- }] arg ...

El comando set realiza tres funciones diferentes.

Sin argumentos, enumera los valores de todas las variables de shell.

Si se proporcionan opciones, establece las banderas de opción especificadas o las borra según se describe en la sección denominada "Procesamiento de la lista de argumentos". Como caso especial, si la opción es -o o +o y no se proporciona ningún argumento, el shell imprime la configuración de todas sus opciones. Si la opción es -o, la configuración se imprime en un formato legible para humanos; si la opción es +o, la configuración se imprime en un formato adecuado para volver a introducirla en el shell para afectar las mismas configuraciones de opción.

Además de los nombres de opción enumerados en la sección "Procesamiento de la lista de argumentos", las siguientes opciones se pueden especificar como argumentos para -o o +o:

pipefail  Deriva el estado de salida de una tubería a partir de los estados de salida de todos los comandos de la tubería, y no solo del último comando, según se describe en la sección "Tuberías".

El tercer uso del comando set es establecer los valores de los parámetros posicionales del shell a los argumentos especificados. Para cambiar los parámetros posicionales sin cambiar ninguna opción, utilice "--" como primer argumento para set. Si no hay argumentos presentes, el comando set borrará todos los parámetros posicionales (equivalente a ejecutar "shift $#").

shift [n]

Desplaza los parámetros posicionales n veces. Un desplazamiento establece el valor de $1 al valor de $2, el valor de $2 al valor de $3, y así sucesivamente, disminuyendo el valor de $# en uno. Si n es mayor que el número de parámetros posicionales, shift emitirá un mensaje de error y saldrá con un estado de retorno de 2.

test expresión

[ expresión ]

La utilidad test evalúa la expresión y, si se evalúa como verdadera, devuelve un estado de salida de cero (verdadero); de lo contrario, devuelve 1 (falso). Si no hay expresión, test también devuelve 1 (falso).

Todos los operadores y las banderas son argumentos separados para la utilidad test.

Las siguientes expresiones primarias se utilizan para construir la expresión:

-b archivo       Verdadero si el archivo existe y es un archivo especial de bloque.

-c archivo       Verdadero si el archivo existe y es un archivo especial de carácter.

-d archivo       Verdadero si el archivo existe y es un directorio.

-e archivo       Verdadero si el archivo existe (independientemente del tipo).

-f archivo       Verdadero si el archivo existe y es un archivo regular.

-g archivo      Verdadero si el archivo existe y su bit de ID de grupo está activado.

-h archivo      Verdadero si el archivo existe y es un enlace simbólico.

-k archivo      Verdadero si el archivo existe y su bit "pegajoso" está activado.

-n cadena       Verdadero si la longitud de la cadena es distinta de cero.

-p archivo      Verdadero si el archivo es una tubería con nombre (FIFO).

-r archivo      Verdadero si el archivo existe y es legible.

-s archivo      Verdadero si el archivo existe y tiene un tamaño mayor que cero.

-t descriptor_de_archivo

Verdadero si el archivo cuyo número de descriptor de archivo es descriptor_de_archivo está abierto y está asociado a un terminal.

-u archivo      Verdadero si el archivo existe y su bit de ID de usuario está activado.

-w archivo      Verdadero si el archivo existe y es escribible. Verdadero indica solo que el
bit de escritura está activado. El archivo no es escribible en un sistema de archivos de solo lectura, incluso si
esta prueba indica verdadero.

-x archivo      Verdadero si el archivo existe y es ejecutable. Verdadero indica solo que el bit de ejecución está activado. Si el archivo es
un directorio, verdadero indica que el archivo se puede
buscar.

-z cadena       Verdadero si la longitud de la cadena es cero.

-L archivo      Verdadero si el archivo existe y es un enlace simbólico. Este operador se mantiene para
compatibilidad con versiones anteriores de este programa. No dependa de su
existencia; use -h en su lugar.

-O archivo      Verdadero si el archivo existe y su propietario coincide con el ID de usuario efectivo de este
proceso.

-G archivo      Verdadero si el archivo existe y su grupo coincide con el ID de grupo efectivo de este
proceso.

-S archivo      Verdadero si el archivo existe y es un socket.

archivo1 -nt archivo2

Verdadero si archivo1 y archivo2 existen y archivo1 es más nuevo que archivo2, o si archivo1 existe pero archivo2 no.

archivo1 -ot archivo2

Verdadero si archivo1 y archivo2 existen y archivo1 es más antiguo que archivo2, o si archivo2 existe pero archivo1 no.

archivo1 -ef archivo2

Verdadero si archivo1 y archivo2 existen y se refieren al mismo archivo.

cadena        Verdadero si la cadena no es la cadena nula.

s1 = s2       Verdadero si las cadenas s1 y s2 son idénticas.

s1 != s2      Verdadero si las cadenas s1 y s2 no son idénticas.

s1 < s2       Verdadero si la cadena s1 precede a s2 según el valor ASCII de sus caracteres.

s1 > s2       Verdadero si la cadena s1 sigue a s2 según el valor ASCII de sus caracteres.

n1 -eq n2     Verdadero si los enteros n1 y n2 son algebraicamente iguales.

n1 -ne n2     Verdadero si los enteros n1 y n2 no son algebraicamente iguales.

n1 -gt n2     Verdadero si el entero n1 es algebraicamente mayor que el entero n2.

n1 -ge n2     Verdadero si el entero n1 es algebraicamente mayor o igual que el entero
n2.

n1 -lt n2     Verdadero si el entero n1 es algebraicamente menor que el entero n2.

n1 -le n2     Verdadero si el entero n1 es algebraicamente menor o igual que el entero
n2.

Estos operadores primarios se pueden combinar con los siguientes operadores:

! expresión  Verdadero si la expresión es falsa.

expresión1 -a expresión2

Verdadero si tanto expresión1 como expresión2 son verdaderas.

expresión1 -o expresión2

Verdadero si expresión1 o expresión2 son verdaderas.


(expresión) Devuelve verdadero si la expresión es verdadera.

El operador -a tiene mayor precedencia que el operador -o.

times Imprime los tiempos acumulados de usuario y sistema para el shell y para los procesos que se ejecutan desde el shell. El estado de retorno es 0.

trap [acción señal ...]

Hace que el shell analice y ejecute la acción cuando se reciban alguna de las señales especificadas. Las señales se especifican por número de señal o por el nombre de la señal. Si la señal es 0 o EXIT, la acción se ejecuta cuando el shell se cierra. La acción puede estar vacía (''), lo que hace que las señales especificadas se ignoren. Con la acción omitida o establecida en '-', las señales especificadas se establecen en su acción predeterminada. Cuando el shell crea un subshell, restablece las señales atrapadas (pero no ignoradas) a la acción predeterminada. El comando trap no tiene efecto sobre las señales que se ignoraron al entrar al shell. trap sin ningún argumento hace que escriba una lista de señales y su acción asociada en la salida estándar en un formato adecuado como entrada para el shell que logra los mismos resultados de la trampa.

Ejemplos:

trap

Lista las señales atrapadas y su acción correspondiente.

trap '' INT QUIT TSTP USR1

Ignora las señales INT, QUIT, TSTP y USR1.

trap date INT

Imprime la fecha al recibir la señal INT.

type [nombre ...]

Interpreta cada nombre como un comando e imprime la resolución de la búsqueda del comando. Las posibles resoluciones son: palabra clave del shell, alias, comando integrado del shell, comando, alias rastreado y no encontrado. Para los alias, se imprime la expansión del alias; para los comandos y los alias rastreados, se imprime la ruta completa del comando.

ulimit [-H | -S] [-a | -tfdscmlpnvwr [valor]]

Consulta o establece los límites duros o blandos en los procesos o establece nuevos límites. La elección entre el límite duro (que ningún proceso puede violar y que no se puede aumentar una vez que se ha reducido) y el límite blando (que hace que los procesos reciban una señal, pero no necesariamente se interrumpan, y que se puede aumentar) se realiza con estas opciones:

-H establece o consulta los límites duros

-S establece o consulta los límites blandos. Si no se especifica ni -H ni -S, se muestra el límite blando o se establecen ambos límites. Si se especifican ambos, el último tiene prioridad.

El límite que se va a consultar o establecer se elige especificando alguna de estas opciones:

-a muestra todos los límites actuales

-t muestra o establece el límite en el tiempo de CPU (en segundos)

-f muestra o establece el límite en el tamaño del archivo más grande que se puede crear (en bloques de 512 bytes)

-d muestra o establece el límite en el tamaño del segmento de datos de un proceso (en kilobytes)

-s muestra o establece el límite en el tamaño de la pila de un proceso (en kilobytes)

-c muestra o establece el límite en el tamaño máximo del archivo de volcado de núcleo que se puede generar (en bloques de 512 bytes)

-m muestra o establece el límite en la cantidad total de memoria física que puede estar en uso por un proceso (en kilobytes)

-l muestra o establece el límite en la cantidad de memoria que un proceso puede bloquear con mlock(2) (en kilobytes)

-p Muestra o establece el límite en el número de procesos que este usuario puede tener en ejecución al mismo tiempo.

-n Muestra o establece el límite en el número de archivos que un proceso puede tener abiertos simultáneamente.

-v Muestra o establece el límite en la cantidad total de memoria virtual que puede estar en uso por un proceso (en kilobytes).

-w Muestra o establece el límite en el número total de bloqueos mantenidos por un proceso.

-r Muestra o establece el límite en la prioridad de programación en tiempo real de un proceso.

Si no se especifica ninguna de estas opciones, se muestra o establece el límite en el tamaño del archivo. Si se especifica un valor, el límite se establece en ese número; de lo contrario, se muestra el límite actual.

Los límites de un proceso arbitrario se pueden mostrar o establecer utilizando la utilidad sysctl(8).

umask [máscara]

Establece el valor de umask (ver umask(2)) al valor octal especificado. Si se omite el argumento, se imprime el valor de umask.

unalias [-a] [nombre]

Si se especifica un nombre, el shell elimina ese alias. Si se especifica -a, se eliminan todos los alias.

unset [-fv] nombre ...

Las variables y funciones especificadas se eliminan y se desexportan. Si se especifica -f o -v, se elimina la función o la variable correspondiente, respectivamente. Si un nombre determinado corresponde tanto a una variable como a una función, y no se especifican opciones, solo se elimina la variable.

wait [trabajo]

Espera a que se complete el trabajo especificado y devuelve el estado de salida del último proceso del trabajo. Si se omite el argumento, espera a que se completen todos los trabajos y devuelve un estado de salida de cero.

Edición de la línea de comandos

Cuando dash se está utilizando de forma interactiva desde un terminal, la línea de comandos actual y el historial de comandos (ver fc en “Integrados”) se pueden editar utilizando la edición de línea de comandos en modo vi. Este modo utiliza comandos, descritos a continuación, similares a un subconjunto de los descritos en la página man de vi. El comando ‘set -o vi’ habilita la edición en modo vi y coloca a sh en el modo de inserción de vi. Con el modo vi habilitado, sh se puede cambiar entre el modo de inserción y el modo de comando. Es similar a vi: escribir ⟨ESC⟩ entra en el modo de comando de vi. Presionar ⟨return⟩ mientras está en el modo de comando pasará la línea al shell.

ESTADO DE SALIDA

Los errores que son detectados por el shell, como un error de sintaxis, harán que el shell salga con un estado de salida distinto de cero. Si el shell no es un shell interactivo, la ejecución del archivo del shell se abortará. De lo contrario, el shell devolverá el estado de salida del último comando ejecutado, o si se utiliza el comando integrado exit con un argumento numérico, devolverá el argumento.

ENTORNO

HOME Se establece automáticamente mediante login(1) a partir del directorio de inicio del usuario en el archivo de contraseñas (passwd(4)). Esta variable de entorno también funciona como el argumento predeterminado para el comando integrado cd.

PATH La ruta de búsqueda predeterminada para los ejecutables. Consulte la sección anterior “Búsqueda de ruta”.

CDPATH La ruta de búsqueda utilizada con el comando integrado cd.

MAIL       El nombre de un archivo de correo, que se verificará para detectar la llegada de nuevo correo. Anulado
por MAILPATH.

MAILCHECK  La frecuencia en segundos con la que el shell verifica la llegada de correo en los archivos
especificados por MAILPATH o el archivo MAIL. Si se establece en 0, la verificación se realizará en cada
prompt.

MAILPATH   Una lista separada por dos puntos (":") de nombres de archivos, para que el shell verifique si hay correo entrante.

Este ajuste de entorno anula el ajuste MAIL. Existe un máximo de 10 buzones que se pueden monitorear a la vez.

PS1        La cadena de prompt principal, que por defecto es "$ ", a menos que sea el superusuario, en
cuyo caso por defecto es "# ".

PS2        La cadena de prompt secundaria, que por defecto es "> ".

PS4        Salida antes de cada línea cuando la traza de ejecución (set -x) está habilitada, por defecto es "+ ".

IFS        Separadores de campos de entrada. Normalmente se establece en [espacio], [tabulación] y [nueva línea]. Consulte
la sección "División de espacios en blanco" para obtener más detalles.

TERM       El ajuste de terminal predeterminado para el shell. Esto se hereda de los procesos secundarios del
shell y se utiliza en los modos de edición del historial.

HISTSIZE   El número de líneas en el búfer de historial del shell.

PWD        El valor lógico del directorio de trabajo actual. Esto lo establece el comando cd.

OLDPWD     El valor lógico anterior del directorio de trabajo actual. Esto lo establece el comando cd.

PPID       El ID de proceso del proceso principal del shell.

ARCHIVOS

$HOME/.profile

/etc/profile

VÉASE TAMBIÉN

csh(1), echo(1), getopt(1), ksh(1), login(1), printf(1), test(1), getopt(3), passwd(5), environ(7), sysctl(8)

HISTORIA

dash es una implementación compatible con POSIX de /bin/sh que tiene como objetivo ser lo más pequeña posible. dash
es un descendiente directo de la versión de NetBSD de ash (el Almquist SHell), que se trasladó a Linux
a principios de 1997. Se cambió el nombre a dash en 2002.

ERRORES

Los scripts de shell con setuid deben evitarse a toda costa, ya que representan un riesgo de seguridad importante.

PS1, PS2 y PS4 deben estar sujetos a la expansión de parámetros antes de mostrarse.