cat 2023-09-16-실행-기록-남기기.md

실행 기록 남기기


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를 확인하는 메뉴를 제공한다. 그냥 심심해서 해본 것이다.