실행 기록 남기기
2023-09-16
프로그램이 내부적으로 특정 명령을 실행하는 것을 기록해보자. 필자의 경우 git 명령을 확인하고 싶었다.
- 본인이 터미널에서 실행한 것을 확인하고 싶다면 단순히
history
명령을 통해 확인하면 된다.
프록시 실행 파일 만들기
먼저, 원하는 명령의 절대 경로를 확인하자
$ which git
/opt/homebrew/bin/git
그 후 명령줄 인수로 오는 것을 그대로 포워딩하는 실행 파일을 만들자. 내 경우에는 cpp로 만들었다.
#include <ctime>
#include <iostream>
#include <sstream>
#include <fstream>
#include <filesystem>
using namespace std;
int main(int argc, const char **argv) {
ostringstream oss;
argv[0] = "git";
for(int i=0; i!=argc; ++i)
oss << argv[i] << " "+(i+1==argc);
fstream log("/Users/fienestar/git-log.txt", fstream::in | fstream::out | fstream::app); // 원하는 로그 파일의 절대 경로
if(log.is_open()) {
log << oss.str() << "\n";
}
oss = ostringstream("");
argv[0] = "/opt/homebrew/bin/git"; // witch를 통해 확인했던 git의 절대 경로
for(int i=0; i!=argc; ++i)
oss << argv[i] << " "+(i+1==argc);
return system(oss.str().c_str());
}
- cwd가 달라질 수 있으므로, 상대 경로를 사용해선 안된다.
- 원한다면 부모 프로그램의 이름과, 실행 시각, cwd를 기록하자
프록시 실행 파일 사용하기
PATH
환경변수에 프록시 실행 파일의 경로를 prepend하자. 원본보다 우선순위가 더 높아야한다.
내 경우에는 fish
라는 쉘을 쓰고 있으므로
$ fish_add_path -g <my-proxy-absolute-path-without-filename>
다른 쉘이면
$ export PATH=<my-proxy-absolute-path-without-filename>:$PATH
이제 터미널을 재실행하고, 환경 변수가 잘 설정되었는지 확인하자
$ which git
<my-proxy-absolute-path-without-filename>
잘 변경되었다면 로그가 남는지 확인하자
$ git hellooooo
git: 'hellooooo'은(는) 깃 명령이 아닙니다. 'git --help'를 참고하십시오.
$ cat /Users/fienestar/git-log.txt
git hellooooo
이제 로그가 남기를 원하는 프로그램을 실행하자. 이미 실행중이라면 이전 환경 변수를 사용하고 있을 수 있으므로, 반드시 종료후 다시 실행해야한다.
- 필자는 intellij의 git 실행 기록이 궁금했었는데, 사실 intellij는 git log를 확인하는 메뉴를 제공한다. 그냥 심심해서 해본 것이다.