Python 스크립트의 출력에서 ​​셸 사전을 만드는 방법은 무엇입니까?

Python 스크립트의 출력에서 ​​셸 사전을 만드는 방법은 무엇입니까?

내 Python scripy는 문자열을 인쇄합니다 print("declare -A gaps=( [2019-2-24]=4 )"). 이를 declare -A gaps=( [2019-2-24]=4 )bash 쉘에서 실행하여 이라는 사전을 만들 수 있습니다 gaps.

내 bash 스크립트에서는 python scripy라는 변수를 사용하여 gap_stringscripy의 출력에 액세스합니다. 그런 다음 기대값 주위에 백틱을 사용하여 사전을 생성했는데 gap_string오류와 함께 실패했습니다 declare: “[2019-2-24]=4”: is not a valid identifier.

자세한 내용은:

내 bash 스크립트의 코드:

declare -A birthdays=(["${year}0120"]="GG")

gap_string=`/home/roach/.config/argos/LunarSolarConverter.py ${!birthdays[@]}`
if [ $? -eq 0 ]; then
    `$gap_string`
fi

내 Python 스크립트의 코드:

if __name__ == '__main__':
    converter = LunarSolarConverter()
    gaps_string = ["declare -A gaps=("]
    today = datetime.datetime.today()
    today_date = today.date()
    year = today.year
    isleap = (year % 4 == 0 and (year % 100 != 0 or year % 400 == 0))
    days_this_year = 366 if isleap else 365
    for i in range(1, len(sys.argv)):
        year, month, day = int(sys.argv[i][:-4]), int(sys.argv[i][-4:-2]), int(sys.argv[i][-2:])
        lunar = Lunar(year, month, day, isleap)
        solar = converter.LunarToSolar(lunar)
        gap = (datetime.date(solar.solarYear, solar.solarMonth, solar.solarDay) - today_date).days % days_this_year
        if gap <= 4:
            gaps_string.append(f"[{solar.solarYear}-{solar.solarMonth}-{solar.solarDay}]={gap}")
    gaps_string.append(")")
    if len(gaps_string) == 2:
        sys.exit(1)
    else:
        print(" ".join(gaps_string))
        sys.exit(0)

Python 스크립트가 하는 일은 음력 날짜를 양력 날짜로 변환한 다음 오늘과 특정 양력 달력 사이의 일 수를 계산하고 가족의 생일을 상기시켜 주는 것입니다.

답변1

백틱을 사용하는 것은 오류입니다. 이렇게 하면 외부 명령처럼 문자열을 실행하려고 시도합니다. 하지만 문자열은세게 때리다현재 쉘의 컨텍스트에서 특정 명령이 실행되었습니다. 이를 수행하는 방법에는 두 가지가 있습니다.

  1. eval그리고 사용명령 대체

    gaps=$( your_python_command )
    eval "$gaps"
    # or, the variable is unnecessary:
    eval "$( your_python_command )"
    
  2. source그리고 사용프로세스 교체

    source <( your_python_command )
    

두 경우 모두 Python 스크립트가 출력하는 내용을 확인하는 것이 좋습니다. 신뢰할 수 없는 코드를 실행하고 싶지는 않습니다.

답변2

디버깅을 위해 명령을 사용할 수 있습니다 set -x. 다음 예를 들어보세요.

set -x
declare -A gaps=( [2017-02-11]=4 )

당신에게 줄 것입니다 :

+ gaps=([2017-02-11]=4)
+ declare -A gaps

그리고

s="declare -A gaps=( [2017-02-11]=4 )"
$s

당신에게 줄 것입니다 :

+ declare -A 'gaps=(' '[2017-02-11]=4' ')'

따라서 두 번째 경우에 실행되는 명령은 다음과 같습니다.

declare -A 'gaps=('
declare -A [2017-02-11]=4
declare -A )

관련 정보