Что произойдет, если я помещу #!/bin/bash внутрь скрипта, но буду использовать ksh для скрипта? [duplicate]

Это решение найдет дубликаты за время O(n). Для каждого файла генерируется контрольная сумма, и каждый файл, в свою очередь, сравнивается с набором известных контрольных сумм через ассоциативный массив.

#!/bin/bash
#
# Usage:  ./delete-duplicates.sh  [<files...>]
#
declare -A filecksums

# No args, use files in current directory
test 0 -eq $# && set -- *

for file in "$@"
do
    # Files only (also no symlinks)
    [[ -f "$file" ]] && [[ ! -h "$file" ]] || continue

    # Generate the checksum
    cksum=$(cksum <"$file" | tr ' ' _)

    # Have we already got this one?
    if [[ -n "${filecksums[$cksum]}" ]] && [[ "${filecksums[$cksum]}" != "$file" ]]
    then
        echo "Found '$file' is a duplicate of '${filecksums[$cksum]}'" >&2
        echo rm -f "$file"
    else
        filecksums[$cksum]="$file"
    fi
done

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

«Первый» файл в наборе всегда считается окончательной версией. Не принимается во внимание время файла, разрешения или права собственности. Учитывается только содержание.

Удалите echo из строки rm -f "$file", если вы уверены, что это делает то, что вы хотите. Обратите внимание: если вы замените эту строку на ln -f "${filecksums[$cksum]}" "$file", вы можете жестко связать контент. Та же экономия места на диске, но вы не потеряете имена файлов.

0
12.05.2018, 08:00
2 ответа

Si ingresa ksh script_name, ejecutará kshcon el argumento script_name. Eso significa que será ejecutado por ksh. El shebang solo importa cuando se ejecuta el script explícitamente (, p../script_name).

5
28.01.2020, 02:13

Respuesta corta:ksh ejecutará el script y tratará #!/bin/bashcomo un comentario.

Explicación:cada vez que se llama a cualquier ejecutable para que se ejecute, bash o cualquier llamada de shell exec()llamada al sistema

exec()carga el archivo y verifica los primeros 16 bits del archivo para ver qué formato ejecutable tiene. Si encuentra  #!, utiliza el resto de la primera línea del archivo para encontrar qué programa debe iniciar y proporciona el nombre del archivo que intentaba iniciar (el script )como último argumento para el programa intérprete.

y así es como el intérprete especificado en shebang ejecuta el script

pero cuando ya especificó ksh y proporcionó el argumento, exec no buscará shebang pero Shell encontrará el binario de la variable $PATHpara cargar el binario y le dará el nombre del archivo como argumento al binario.

4
28.01.2020, 02:13

Теги

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