내 Python scripy는 문자열을 인쇄합니다 print("declare -A gaps=( [2019-2-24]=4 )")
. 이를 declare -A gaps=( [2019-2-24]=4 )
bash 쉘에서 실행하여 이라는 사전을 만들 수 있습니다 gaps
.
내 bash 스크립트에서는 python scripy라는 변수를 사용하여 gap_string
scripy의 출력에 액세스합니다. 그런 다음 기대값 주위에 백틱을 사용하여 사전을 생성했는데 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
백틱을 사용하는 것은 오류입니다. 이렇게 하면 외부 명령처럼 문자열을 실행하려고 시도합니다. 하지만 문자열은세게 때리다현재 쉘의 컨텍스트에서 특정 명령이 실행되었습니다. 이를 수행하는 방법에는 두 가지가 있습니다.
eval
그리고 사용명령 대체gaps=$( your_python_command ) eval "$gaps" # or, the variable is unnecessary: eval "$( your_python_command )"
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 )