Влияние на безопасность выполнения строк с помощью eval в bash

Пожалуйста, выведите конвейер, который вы получили в приведенной ниже команде

я удалил журнал строки предупреждения :предупреждение :и добавил заголовок, который вы упомянули. Все сделано с помощью awk с правильным форматированием пространства

команда

awk 'BEGIN{print "Date Time Type bundle Logininformation"}NR >1{gsub("Informing\t  the  JSS  about","Local",$0);print $0}' k.txt|sed '/^$/d'| awk '{printf "%30s%30s%30s%30s%30s\n",$1,$2,$3,$4,$5}'| awk '$0 !~/^$/{print $0}'

выход

awk 'BEGIN{print "Date Time Type bundle Logininformation"}NR >1{gsub("Informing\t  the  JSS  about","Local",$0);print $0}' k.txt|sed '/^$/d'| awk '{printf "%30s%30s%30s%30s%30s\n",$1,$2,$3,$4,$5}'| awk '$0 !~/^$/{print $0}'
                          Date                          Time                          Type                        bundle              Logininformation
                    2019-04-25          09:49:26.843101+0530                       Default                         jamf:[com.jamf.management.binary:all]
                    2019-04-25          20:14:47.928848+0530                       Default                         jamf:[com.jamf.management.binary:all]
1
15.04.2021, 22:11
1 ответ

Если bсодержит буквальную строку printf "%s\n" "$a", т. е. вы не расширили $aдо нее, тогда да, eval "$b"должно быть хорошо. Не знаю, зачем вам там eval, ведь у вас просто статическая команда. Просто запустите printf "%s\n" "$a"напрямую.

В комментариях вы сказали, что хотите сохранить некоторые команды для использования в будущем. Это работа функций. Например. эту команду printfможно превратить в функцию, подобную этой:

println() {
    printf "%s\n" "$1"
}

, который вы запускаете как println "hello there", println "$a"или что-то еще. "$1"— это первый аргумент функции, но, конечно, вместо этого вы можете прочитать стандартный ввод или использовать несколько аргументов ("$2", "$3",...; или все они в виде списка"$@"(похожи"${array[@]}")).

Аналогично для более длинного набора операций:

#!/bin/bash
say_hi() {
    echo "hello, $1"
}
louder() {
    echo "$1!"
}
funcs=(say_hi louder)
names=(Huey Dewey Louie)
for name in "${names[@]}"; do
    tmp=$name
    for func in "${funcs[@]}"; do
        tmp=$($func "$tmp")
    done
    echo "result: $tmp"
done
2
28.04.2021, 22:52

Теги

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