Как определить оболочку scr ipt должен быть получен, а не запущен

Если вы наберете unzip -l , он распечатает список файлов в zip-архиве. , с их размерами без сжатия, то общий размер всех файлов без сжатия.

Это удобочитаемый результат, но вы можете получить машиночитаемый номер, используя unzip -l | хвост -n1 | awk '{print $ 1}' .

Чтобы получить общий размер:

total=0
for file in *.zip; do # or whichever files you want
    (( total += $(unzip -l $file | tail -n1 | awk '{ print $1 }') ))
done
echo $total
41
16.02.2018, 01:05
4 ответа

Suponiendo que está ejecutando bash, coloque el siguiente código cerca del inicio del script que desea obtener pero no ejecutar:

if [ "${BASH_SOURCE[0]}" -ef "$0" ]
then
    echo "Hey, you should source this script, not execute it!"
    exit 1
fi

En bash, ${BASH_SOURCE[0]}contendrá el nombre del archivo actual que está leyendo el shell, independientemente de si se está generando o ejecutando.

Por el contrario, $0es el nombre del archivo actual que se está ejecutando.

-efprueba si estos dos archivos son el mismo archivo. Si lo son, alertamos al usuario y salimos.

Ni -efni BASH_SOURCEson ​​POSIX. Mientras que -efes compatible con ksh, yash, zsh y Dash, BASH_SOURCErequiere bash. En zsh, sin embargo, ${BASH_SOURCE[0]}podría ser reemplazado por ${(%):-%N}.

55
27.01.2020, 19:35

Cuando obtiene un script de shell, la línea shebang se ignora. Al ingresar un shebang no válido, puede alertar al usuario de que el script se ejecutó erróneamente:

#!/bin/bash source-this-script
#...

El mensaje de error será este:

/bin/bash: source-this-script: No such file or directory

El nombre de argumento arbitrario ()ya proporciona una pista fuerte, pero el mensaje de error aún no es 100% claro. Podemos solucionar esto con un script de utilidad source-this-scriptque se coloca en algún lugar de suPATH:

#!/bin/sh
echo >&2 "This script must be sourced, not executed${1:+: }${1:-!}"
exit 1

Ahora, el mensaje de error será este:

This script must be sourced, not executed: path/to/script.sh

Comparación con otros enfoques

En comparación con las otras respuestas,este enfoque solo requiere cambios mínimos en cada script (y tener una línea shebang ayuda con la detección del tipo de archivo en los editores y especifica el dialecto del script de shell, por lo que incluso hay beneficios ). La desventaja es un mensaje de error poco claro, o la adición (una -vez )de otro script de shell.

No evita la invocación explícita a través de bash path/to/script.sh, aunque (¡gracias @muru! ).

6
27.01.2020, 19:35

Suponiendo que es inútil, en lugar de dañino, ejecutar el script, puede agregar

return 0 || printf 'Must be sourced, not executed\n' >&2

hasta el final del guión. returnfuera de una función tiene un código de salida que no es cero -a menos que el archivo se esté originando.

7
27.01.2020, 19:35

Не -исполняемый файл может быть получен, но не выполнен, поэтому в качестве первой линии защиты хорошим советом будет не устанавливать флаг исполняемого файла...

Редактировать :трюк, на который я только что наткнулся :сделать shebang любым исполняемым файлом, который не является интерпретатором оболочки, /bin/falseзаставляет скрипт возвращать ошибку (rc!=0)

#!/bin/false "This script should be sourced in a shell, not executed directly"
37
27.01.2020, 19:35

Теги

Похожие вопросы