쉘 스크립트에서 ROOT에 명령을 전달하고 열어 두십시오.

쉘 스크립트에서 ROOT에 명령을 전달하고 열어 두십시오.

이 프로그램을 사용하여 몇 가지 분석을 수행하기 위해 bash 스크립트를 작성 중입니다.뿌리. 몇 가지 초기 명령을 실행하여 분석 결과를 로드한 다음 ROOT를 대화식으로 계속 사용하고 싶습니다.

분석 부분은 잘 진행되고 있는데 문제는 root초기 명령어 실행 후 바로 종료되는 점입니다. 지금까지 나는 초기 명령을 전달하기 위해 EOF(여기에 파일 있음) 구성을 사용해 보았지만 쉘 스크립트는 처음 접했기 때문에 ROOT스크립트가 실행된 후 스크립트를 계속 실행하는 방법에 대한 여러분의 의견을 듣고 싶습니다. . 즉, 시스템 프롬프트 대신 ROOT 프롬프트를 보고 싶습니다.

./runReader.py SummerStd 140PU_NM1 
root -l SummerStd_140PU_NM1_his.root << EOF
TBrowser a;
EOF

위의 코드는 분석을 수행한 다음 실행됩니다 root. 그러나 즉시 종료되고 ROOT 프롬프트 대신 시스템 프롬프트가 있으므로 TBrowser를 확인할 시간이 없습니다. 추가 명령을 수동으로 입력할 수 있도록 root스크립트가 프로그램에 명령을 보낸 후 명령 프롬프트에 제어권을 유지하고 싶습니다 .TBrowser

답변1

다음을 수행할 수 있습니다.

expect -c 'spawn -noecho root -l SummerStd_140PU_NM1_his.root
           send "TBrowser a;\r"
           interact'

답변2

ROOT를 사용하면 실제로는 매우 간단합니다. root프로그램은 명령줄에 전달된 파일을 읽고 나면 계속해서 대화형 명령을 읽습니다(이 -q옵션을 전달하지 않는 한). 따라서 파일 매개변수를 추가하여 시작 명령을 전달할 수 있습니다.추가 파일 설명자.

#!/bin/sh
./runReader.py SummerStd 140PU_NM1 
root -l SummerStd_140PU_NM1_his.root /dev/fd/3 3<<'EOF'
TBrowser a;
EOF

이는 Linux, FreeBSD 및 OSX에서 가장 좋은 방법이지만 root길이가 0인 파일을 무시하는 것 같아서 일부 다른 파일에서는 작동하지 않을 수 있습니다./dev/fd일반 파일의 유닉스 변형이 아닙니다.예를 들어 Solaris( /dev/fd는 장치 파일) 또는 AIX 및 HP-UX( /dev/fd존재하지 않음)입니다. 이러한 플랫폼에서 스크립트를 실행해야 하는 경우 임시 파일에 시작 명령을 배치할 수 있습니다. 이 명령은 스크립트가 종료될 때 실행되도록 trap설정됩니다 .rm -f "$tmp_root"

#!/bin/sh
./runReader.py SummerStd 140PU_NM1
tmp_root=tmp-$$.root
trap 'rm -f "$tmp.root"' EXIT HUP INT TERM
cat >tmp_root <<'EOF'
TBrowser a;
EOF
root -l SummerStd_140PU_NM1_his.root tmp.root

¹ 이 스크립트를 사용하는 일부 "이국적인"(예: Linux 또는 *BSD가 아닌) 플랫폼에서는 사용할 수 없기 때문에 사용하지 않았습니다 .mktemp

관련 정보