Получить и установить аргументы скрипта из функции в bash

make cleanпредназначен только для цели deb-pkg. Взгляните наscripts/package/Makefile:

deb-pkg: FORCE
        $(MAKE) clean
        $(call cmd,src_tar,$(KDEB_SOURCENAME))
        $(MAKE) KBUILD_SRC=
        +$(call cmd,builddeb)

bindeb-pkg: FORCE
        $(MAKE) KBUILD_SRC=
        +$(call cmd,builddeb)

Если вместо этого вы построите bindeb-pkg, он не сделает очистку. Вам, вероятно, все равно не нужны исходные пакеты.

Я подозреваю, что он делает очистку, потому что не хочет архивировать артефакты сборки в исходном архиве.

3
18.12.2019, 10:17
1 ответ

Отказ от ответственности:

Из приведенного выше обсуждения я реализовал решение. Это далеко не то, о чем я мечтал, из-за многословия ${args _array[1]} по сравнению с $1. Делает источник менее читаемым. Таким образом, улучшения или лучшее решение по-прежнему приветствуются.

Источник:

Проверено, примерно так:

#!/bin/bash 

#########################    
# DEBUG
#########################    

# set -x
PS4='${xchars:-+} ${BASH_SOURCE}:${LINENO} (${FUNCNAME[@]}) + ' # full stack

#########################    
# INITIAL ARGS FOR TEST
#########################    
set -- a b c d e f g h

#########################    
# UTILITIES
#########################    

args_array=( "$@" ) # script args here

args_shift() # Usage readability OK, replaces shift <n>
{
   typeset n=${1:-1}

               echo "args_shift $1 in ${FUNCNAME[1]} -- ${args_array[@]}"

   args_array=( "${args_array[@]:$n}" ) # ${1:-1} unsupported in this context

               echo "args_shift $1 in ${FUNCNAME[1]} ++ ${args_array[@]}"
}

args_set() # Usage readability OK, replaces set -- <args>
{
               echo "args_set $@ in ${FUNCNAME[1]} -- ${args_array[@]}"

   args_array=( "$@" ) # function args here

               echo "args_set $@ in ${FUNCNAME[1]} ++ ${args_array[@]}"
}

# Usage
# search/replace OK, and good readability afterward
# shift <n> ---> args_shift <n>
# set -- <args> ---> args_set <args>

# search/replace OK, but bad readability afterward, and refactoring--
# $@ ---> ${args_array[@]}
# $# ---> ${#args_array[@]}
# $1 ---> ${args_array[0]}   !!! 1 -> 0
# $2 ---> ${args_array[1]}   !!! 2 -> 1
# etc

#########################
# TEST
#########################    

f()
{
   args_shift
}

g()
{
   args_set A B C D
}

# main

echo "main -- ${args_array[@]}"
f
args_shift 2
f
g
args_shift
f
echo "main ++ ${args_array[@]}"

Выход:

main -- a b c d e f g h
args_shift  in f -- a b c d e f g h
args_shift  in f ++ b c d e f g h
args_shift 2 in main -- b c d e f g h
args_shift 2 in main ++ d e f g h
args_shift  in f -- d e f g h
args_shift  in f ++ e f g h
args_set A B C D in g -- e f g h
args_set A B C D in g ++ A B C D
args_shift  in main -- A B C D
args_shift  in main ++ B C D
args_shift  in f -- B C D
args_shift  in f ++ C D
main ++ C D

Замечания:

  1. Работает, но не самое читаемое решение, и рефакторинг не такой легкий, потому что есть несколько форм использования, которые следует учитывать :$1, более или менее ${1[ :/][^}] } или ${!1[ :/][^}] } и т. д., избегая при этом тех, что в function, awk, perl и т. д.
  2. Для некоторых, поскольку имена переменных в bash чувствительны к регистру и, я думаю, используются более или менее редко, можно было бы использовать A или _A вместо массива args _, но, на мой вкус, ${A [1]} или около того в длинном источнике еще хуже читается, чем ${args _array[1]}.

Моя ситуация:

Есть как минимум 616 вхождений, о которых нужно позаботиться... внимательно (некоторые из них находятся в функциях,сценарии awk или perl и т. д.)

for s in shift 'set --' '$@' '${@' '$*' '${*' '$1' '${1' '$2' '${2' '$3' '${3' '$4' '${4' '$5' '${5'; do
   printf '%-10s: %d\n' "$s " "$(fgrep $s <script>|wc -l)"
done # |awk '{sum+=$NF};END{print sum}'

shift     : 44
set --    : 189
$@        : 39
${@       : 2
$*        : 7
${*       : 0
$1        : 182
${1       : 79
$2        : 48
${2       : 3
$3        : 15
${3       : 0
$4        : 8
${4       : 0
$5        : 0
${5       : 0
0
27.01.2020, 21:32

Теги

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