Cómo hacer que sus scripts de Bash sean compatibles con el hardware

Contenidos

Bash Shell

Escribir scripts para ejecutar en diferentes computadoras Linux es difícil. No se puede hacerse cargo que tendrán las mismas características. los getconf El comando le posibilita verificar cientos de valores del sistema operativo y del sistema de archivos.

Secuencias de comandos con acreditación de hardware

Si en algún momento ha escrito una secuencia de comandos que debe ejecutarse en una gama de máquinas Linux, es factible que se haya enfrentado al dilema de «Extraño, funciona bien en mi máquina …». Las pequeñas diferencias entre la arquitectura de la computadora, los sistemas operativos y los sistemas de archivos en las máquinas de destino pueden impedir que sus scripts funcionen correctamente.

Si sus scripts son simples y nada de lo que hacen, o intentan iniciar, depende del hardware compatible o de ciertas capacidades del sistema de archivos, es factible que nunca tenga un obstáculo. Pero cuanto más complejo se torna su script, más críticos son los detalles de la máquina que ejecuta el script. Además es importante destacar señalar que una sola computadora puede tener varios sistemas de archivos instalados, montados en diferentes partes del árbol de directorios. El hecho de que algo funcione en un directorio no significa que funcionará de la misma manera en otro directorio.

los getconf El comando puede informar literalmente sobre cientos de diferentes sistemas operativos y características del sistema de archivos. Algunos de estos toman la forma de pares de valores, uno con el máximo del sistema y el otro con el mínimo. Esto significa que puede probar los valores del sistema de archivos o del hardware para asegurarse de que su secuencia de comandos reaccione en consecuencia.

De todos modos, su secuencia de comandos no puede utilizar getconf en el equipo de destino si no está instalado en ese equipo. Todas las distribuciones que se probaron al investigar este post habían getconf ya instalado, incluidos Ubuntu, Fedora y Manjaro. Curiosamente, todos tenían la misma versión de getconf además, la versión 2.33.

Primeros pasos con el comando getconf

Puedes chequear que tienes getconf instalado en su computadora y averigüe qué versión es, usando el --version opción.

getconf --version

Para ver cuántos posts getconf puede informar, utilice el -a (todos) y canalizarlo a través de la wc mando. Esto contará las líneas, palabras y caracteres en la salida.

getconf -a | wc

Hay 320 líneas en la salida. Para ver la lista completa de una manera manejable, canalizaremos la salida a less .

getconf -a | less

Puede desplazarse hacia adelante y hacia atrás en el listado para ver qué getconf puede informar.

Salida de getconv -a en el visor de archivos menos

Algunos de los ítems están duplicados. A muchos de ellos se les puede llamar por un nombre más corto o por un nombre más largo compatible con POSIX.

Informar sobre valores únicos

Causar getconf para informar sobre un solo valor, pase el nombre del valor a getconf en la línea de comando. Tenga en cuenta que todos los nombres de las alternativas están en mayúsculas.

getconf LONG_BIT

los LONG_BIT Option informa si su kernel, y por eso, su sistema operativo, es de 32 bits o de 64 bits. No se requieren otros parámetros para este comando, solo la propia opción LONG_BIT. Otro valor simple sobre el que informar es LOGIN_NAME_MAX .

getconf LOGIN_NAME_MAX

Esa es una longitud máxima extrañamente alta para un nombre de usuario, pero es cierto. Si verdaderamente quisiera crear una cuenta de usuario con un nombre de usuario ridículamente largo, podría hacerlo. Por el contrario, el nombre de host de esta computadora dispone de una longitud máxima de 64 caracteres:

getconf HOST_NAME_MAX

Para ver cuántos procesos simultáneos puede ejecutar una cuenta de usuario, utilice el CHILD_MAX opción:

getconf CHILD_MAX

los OPEN_MAX value devuelve el número máximo de archivos que un procedimiento puede tener abiertos.

getconf OPEN_MAX

Para ver un subconjunto del getconfvalores podemos utilizar el -a (todo) opción para generar todos los valores y utilizar grep para filtrar los que nos interesan. A modo de ejemplo, para ver todos los valores que disponen «NOMBRE» en su título, utilice:

getconf -a | grep NAME

De la misma forma, para ver todos los valores con «GRUPO» en su título, utilice:

getconf -a | grep GROUP

Para ver los valores que disponen «INT_» en su título, use:

getconf -a | grep _INT

Esto muestra los valores máximo y mínimo que una variable entera puede contener en esta computadora.

RELACIONADO: Cómo buscar con «grep» usando cadenas en un archivo

Utilizar getconf con valores del sistema de archivos

Cuando utiliza cualquiera de las alternativas asociadas con las características del sistema de archivos, debe indicar getconf sobre qué sistema de archivos debe informar. Debe hacer esto inclusive si solo tiene un solo disco duro y un solo sistema de archivos instalados. los getconf El comando no asumirá nada. Para indicar el sistema de archivos getconf debe informar, debe proporcionar una ruta a un directorio en ese sistema de archivos.

Para ver la longitud máxima de un nombre de archivo para el sistema de archivos montado en la raíz del árbol de directorios del sistema de archivos, escriba:

getconf NAME_MAX /

Para ver el resultado de un sistema de archivos distinto, apunte a un directorio ubicado en el otro sistema de archivos. Inclusive si no tiene diferentes sistemas de archivos montados permanentemente en su árbol de directorios, puede encontrarse con otro sistema de archivos adjunto temporalmente a su árbol de directorios.

Esto es exactamente lo que sucede cuando inserta una memoria USB, como en este ejemplo. La tarjeta de memoria se llama «PINK» y está montada en «/ media / dave /».

getconf NAME_MAX /media/dave/PINK/

Podemos verificar qué sistema de archivos hay en la memoria USB usando el df comando para ver a qué dispositivo de bloque está conectado. Posteriormente usamos el lsblk comando con el -f (sistema de archivos) opción.

df /media/dave/PINK
lsblk -f /dev/sdb1

La tarjeta de memoria es un dispositivo de bloqueo. /dev/sdb1 y el sistema de archivos es FAT32. Es por ello que obtendremos resultados diferentes para dos directorios en el mismo árbol de directorios. Están en el mismo árbol de directorios, pero disponen diferentes sistemas de archivos subyacentes.

RELACIONADO: ¿Qué sistema de archivos debo usar para mi unidad USB?

Usando getconf en Scripts

Podemos incorporar fácilmente la salida de getconf en decisiones dentro de nuestros scripts de shell.

A modo de ejemplo, para realizar diferentes acciones dependiendo de si la secuencia de comandos se ejecuta en un sistema operativo de 32 bits o de 64 bits, puede usar una sección de secuencia de comandos como esta.

#!/bin/bash

# are we on a 32 or 64 bit OS?
if [ $(getconf LONG_BIT) = "64" ]
then
  # 64 bit
  echo "64-bit machine."
else
  # 32 bit
  echo "32-Bit machine."
fi

los if declaración compara la salida de la getconf LONG_BIT comando con el valor de «64». Si coinciden, el then la cláusula se ejecuta caso contrario el else se ejecuta la cláusula. Puede realizar acciones específicas de la versión en el then/elsecláusulas o establezca indicadores de variables que se pueden verificar en otra parte de su secuencia de comandos.

Copie el texto del script en un editor y guarde su archivo como «hw-test.sh». Haremos que el script sea ejecutable con el chmod comando y el -x (ejecutable) opción.

chmod +x hw-test.sh

Cuando ejecutamos el script, nos dice cuáles de las cláusulas se activaron. Usando esta técnica, puede utilizar cualquiera de los getconf valores para dirigir su secuencia de comandos a realizar la acción adecuada.

./hw-test.sh

Exceso de alternativas

La gran cantidad de valores que getconf puede ser abrumador. los man La página es sorprendentemente breve. Si espera que enumere las alternativas y explique cada una, se sentirá decepcionado.

Encontrarás algunas descripciones en el man páginas para sysconf y confstr. Es factible que deba recortar algunos caracteres del frente del confstr entradas. A modo de ejemplo, esto no funcionó:

getconf _CS_GNU_LIBC_VERSION

pero esto hizo:

getconf GNU_LIBC_VERSION

Además encontrará algunas descripciones en el archivo «limits.h». Si no sabe dónde está ese archivo en su sistema, use:

whereis limts.h 

A continuación, puede usar less para revisar ese archivo.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.