bash функция, которая либо получает имя файла в качестве аргумента, либо использует стандартный ввод - PullRequest
1 голос
/ 04 марта 2020

Я хочу написать несколько оберток вокруг функции sha1sum в bash. С man-страницы:

SHA1SUM(1)                                          User Commands                                          SHA1SUM(1)

NAME
       sha1sum - compute and check SHA1 message digest

SYNOPSIS
       sha1sum [OPTION]... [FILE]...

DESCRIPTION
       Print or check SHA1 (160-bit) checksums.

       With no FILE, or when FILE is -, read standard input.

Как настроить упаковщик так, чтобы он работал таким же образом? Т.е.:

my_wrapper(){
  # some code here
}

, который может работать как:

my_wrapper PATH_TO_FILE

и

echo -n "blabla" | my_wrapper

Я думаю, это как-то связано с Перенаправлять стандартный ввод динамически в bash скрипте , но не уверен, как сделать это «красиво».

Редактировать 1

Я программирую достаточно защищенно, поэтому использую весь сценарий:

# exit if a command fails
set -o errexit
# make sure to show the error code of the first failing command
set -o pipefail
# do not overwrite files too easily
set -o noclobber
# exit if try to use undefined variable
set -o nounset

Что-нибудь, что с этим работает?

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Этот код работает для меня, поместите его в файл с именем wrapper

#!/bin/bash


my_wrapper(){
    if [[ -z "$1" ]];then
        read PARAM
    else
        PARAM="$1"
    fi

    echo "PARAM:$PARAM"
}

Загрузите функцию в вашей среде

. ./wrapper

Проверьте функцию с входным каналом

root@51ce582167d0:~# echo hello | my_wrapper
PARAM:hello

Проверить функцию с параметром

root@51ce582167d0:~# my_wrapper bybye
PARAM:bybye
1 голос
/ 04 марта 2020

Вы можете использовать эту простую обертку:

args=("$@")         # save arguments into an array
set -o noclobber nounset pipefail errexit
set -- "${args[@]}" # set positional arguments from array

my_wrapper() {
   [[ -f $1 ]] && SHA1SUM "$1" || SHA1SUM
}

my_wrapper "$@"

Обратите внимание, что вы можете использовать:

my_wrapper PATH_TO_FILE

или:

echo -n "blabla" | my_wrapper
0 голосов
/ 04 марта 2020

Хорошо, поэтому ответы, размещенные здесь, часто бывают хорошими, но в моем случае с опциями защитного программирования:

# exit if a command fails
set -o errexit
# exit if try to use undefined variable
set -o nounset

все также не работает. Поэтому я сейчас использую что-то в этом роде:

digest_function(){
    # argument is either filename or read from std input
    # similar to the sha*sum functions

    if [[ "$#" = "1" ]]
    then
        # this needs to be a file that exists
        if [ ! -f $1 ]
        then
            echo "File not found! Aborting..."
            exit 1
        else
            local ARGTYPE="Filename"
            local PARAM="$1"
        fi
    else
        local ARGTYPE="StdInput"
        local PARAM=$(cat)
    fi

    if [[ "${ARGTYPE}" = "Filename" ]]
    then
        local DIGEST=$(sha1sum ${PARAM})

    else
        local DIGEST=$(echo -n ${PARAM} | sha1sum)
    fi
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...