다른 명령을 기억하는 함수를 만드는 방법은 무엇입니까?

다른 명령을 기억하는 함수를 만드는 방법은 무엇입니까?

모든 명령을 기억하기 위해 다음 함수를 만들었습니다.

# zsh
(( $+functions[ec] )) || {
    ec() print -r -- "$@"
    ecerr() { ec "$@" 1>&2 }
    ecdbg() ecerr "$@"
    gq() { ec "${(q+@)@}" }
}
(( $+functions[dvar] )) || function dvar() {
        local pre=''
        test -z "$2" || pre="CODE $2 | "
        echo "$pre$(typeset -p "$1" 2>&1)"
        echo "$pre$1 in env: $(printenv "$1")"
    }
## Aliases
## Vars
memoi_expire=$(( 3600*24*7 ))
## Functions
function mem() { memoi_expire=$(( $1 * 60 )) reval "$@" }
function memoi-eval() {
    typeset -Ag memoi_stdout
    typeset -Ag memoi_stderr
    typeset -Ag memoi_timestamp
    typeset -Ag memoi_exit
    typeset -Ag memoi_debug

    dvar memoi_exit
    local now="$(date +%s)"
    local cmd="$(gq "$@")"
    re dvar cmd memoi_expire memoi_timestamp now
    { (( $+memoi_timestamp[$cmd] )) && ecdbg ice0 && { (( memoi_expire == 0 )) || { ((memoi_expire >= 0 )) && ecdbg fire0 && (( (now - memoi_timestamp[$cmd]) <= memoi_expire )) && ecdbg fire1 } } && ecdbg monkey0 } && {
        dact fsay using memoi
        ecdbg Using memoi: "$cmd"
        test -n "$memoi_stdout[$cmd]" && ec "$memoi_stdout[$cmd]"
        test -n "$memoi_stderr[$cmd]" && ecerr "$memoi_stderr[$cmd]"
        (exit 0)
   } || {
        dact fsay memoi not fresh enough
        ecdbg 'Evaling (no memoi): ' "$cmd"
        local errfile="$(mktemp)"
        memoi_stdout[$cmd]="$(eval "$cmd" 2>"$errfile")"
        memoi_exit[$cmd]=$?
        memoi_stderr[$cmd]="$(<$errfile)"
        \rm "$errfile"
        memoi_timestamp[$cmd]="$(date +%s)"
        test -n "$memoi_stdout[$cmd]" && ec "$memoi_stdout[$cmd]"
        test -n "$memoi_stderr[$cmd]" && ecerr "$memoi_stderr[$cmd]"
    }
    dvar memoi_exit
    # dvar memoi_stdout
    memoi_debug[$cmd]=yes
    memoi_debug[apple]=yes
    return $memoi_exit[$cmd]
}

작동하지만 내 문제는 쉘이 포크로 가득 차 있고 포크된 하위 쉘이 상위 쉘의 변수를 설정할 수 없다는 것입니다. 그러므로,

memoi-eval echo hi

유효하지만

memoi-eval echo hi2 |cat아니요. 내 옵션은 무엇입니까?

프로세스 대체에 대한 다음 해결 방법을 찾았습니다(일부 공백이 손실됨).

local some_var
nulterm some_command |read -d '' -r some_var
# deps
reval () {
    ecdbg revaling "$(gq "$@")"
    eval "$(gq "$@")"
}
nulterm () {
    reval "$@"
    ec $'\0'
}

하지만 파이프를 피하는 것은 상당히 어렵습니다. 이를 수행할 수 있는 우아한 방법이 있습니까? s를 사용하면 효과가 있을 것 같지만 fifo코딩이 매우 어려워질 것입니다.

메모리 내 키-값 저장소를 사용해야 합니까 redis?

관련 정보