쩔쩔매면서 리눅스 명령어 하나씩 공부 중...

파일과 디렉토리 3 부분이었나... 여기를 공부하다가 문제가 생겼다.

이런식으로 뒤쪽 명령어에서 허가 거부가 뜨는 명령어들을 만남. 왜!!!! 왜안돼!!!!

최초의 의문은 아래 명령어였음.

최고의 ai 뤼튼에게 질문했더니 얻은 답은 이거다. 그렇게 나와 첫 만남을 가진 tee 명령어...

뤼튼이 알려준 대로 명령어를 입력하니 올바르게 실행이 되었다. 하지만 이게 왜 되는건지 너무 궁금해진 거임. 그래서 잘 모르는 명령어들에 대해서 검색해보고 적어보기로 함. 고렇게 나의 첫 교보DTS TIL 게시물 결정...!


🙄 표준입력? >>?

사실 일단 이것부터 몰랐어용. 걍 꺽쇠... 옆으로 가란건가? 대가리만 벅벅 긁으면서 걍 씀. 그리고 뤼튼에게 질문을 하다보면 표준입력이라는 말을 굉장히 많이 듣게된다. 입력이면 그냥 입력이지 표준을 왜 붙이는것... 표준이 아닌 입력도 있나...

표준입력에 대한 설명은 이 링크를 참고했다.

표준 스트림(standard stream)
→ 운영 체제에서 기본적으로 제공하는 추상화된 입출력 장치

표준 스트림설명
표준 입력(STDIN)표준 입력 장치의 ID는 숫자로는 0이며 일반적으로는 키보드가 된다
표준 출력(STDOUT)출력을 위한 스트림, ID는 1이며 일반적으로는 현재 쉘을 실행한 콘솔(console))이나 터미널이 된다
표준 에러(STDERR)에러를 위한 스트림, ID는 2, 일반적으로는 표준출력과 동일하다

표준..이라는 말을 참 좋아하는구나...

말이 어려웠지만, 그냥 내가 키보드에 인풋을 넣는게 표준입력이 되는거고, 그 결과가 터미널 창이나 콘솔에 보여지는 것을 표준 출력이라고 하는 것이었다.

💡 >, >> → append 명령어!

막연하게 다음순서~,,, 를 가리키는 명령어일까 추측했는데 전혀 아니었음. 이것은 입력을 저장하여 출력하는 것과 관련이 있는 명령어였다.

차이점은 저장 방식이다.

  • > : 지정한 파일에 덮어쓰기로 저장
  • >> : 이어쓰기로 저장

🔁 리눅스의 리다이렉션(redirection)과 파이프(|)

기본적으로 리눅스 명령어 실습을 하다보면 명령어 두 개 정도를 조합해서 사용을 많이 하게 된다.

우리가 명령어를 사용해 입력을 하면, 그에 대한 결과가 출력되어 모니터에 나타난다. 첫 번째 명령어를 실행해서 나온 결과를 뒤에 나오는 명령어가 납!치! 해서 해당 명령어의 표준 입력으로 낚아채어 보내는 것리다이렉션이라고 한다.

명령어의 입력 - 실행 - 결과 이 흐름을 리눅스에서는 파이프라고 하는 것 같다. 그래서 첫 번째 명령어의 파이프 결과를 바로 출력하지 않고, 다른 명령어 파이프로 흘러가도록 연결해주는 명령어가 바로 |이다.

🌳 tee

본론으로 드디어 왔군... tee 명령어가 과연 무엇일까?!
자꾸 나도 모르게 tree라고 읽게됨...

파이프와 유사하지만, 한 가지 일을 더 한다. 명령어 파이프를 연결해주는 것은 동일하다.

  1. 앞의 명령어 파이프에서 받아온 표준 출력을 파일 또는 모니터에 출력한다.
  2. 받아온 표준 출력을 뒤에 이어지는 명령어에 표준 입력으로 대체해준다.

예시로 바로 설명하겠음!

  1. echo 명령어로 표준 입력이 들어온다.

  2. 파이프(|)로 연결되어 있기 때문에 에코 명령어 파이프의 출력 결과는 납치된다!

  3. 이 다음 tee 명령어의 역할 👉 앞에서 받아온 표준 출력을 모니터에 출력해준다. 따라서 test 계정에 암호를 입력하고 나면 echo 명령어로 실행한 결과인 'Addtional log entry'가 화면에 출력되게 된다.

  4. -a: 이 옵션은 append(추가)의 약자이다. sudo의 권한을 가진 무적 이기 때문에... 이 권한을 등에 업고 뒤에 이어지는 경로(/var/log/app.log)로 이어지는 app.log 파일에 새로운 내용을 추가한다.

여기까지 쓰고보니 내가 이전에 이런 명령어를 왜 쳤지? 여기서 cat이 또 왜 튀어나오지? 라는 생각이 들었다. 잘못 쓴거임. cat 명령어도 tee 명령어로 연결이 되어야 하는데 현재 구조에선 cat이 무시된다. 어쩐지...

제대로 작성하려면

echo "Additional log entry." | sudo tee -a /var/log/app.log && sudo cat /backup/app_backup.log

요렇게 && 연산자로 명령어를 연결시켜주어야 한다.

🤷🏻‍♀️ 시스템 디렉토리

뤼튼이 친절하게 알려준 tee 명령어를 통해서 어느정도 의문은 해소되었지만, 당시에는 풀리지 않는 의문점이 하나 더 있었다.

다른 실습 문제에서는 >> 연산자 뒤에 바로 sudo 갈기고 경로 갈겨도 작동이 잘 되었는데 여기서 최초로 막힌건가 그래서 이 차이점이 이해가 안 돼서 뤼튼에 질문을 했고... 이런 답을 얻었다.

아직 뭐 모르는 것도 많고 잘 이해가 안 가는 것도 있지만... 루트 경로(/)에서는 관리자 권한이 필요하다. test 계정 내에서 만든 것에서는 무척 자유롭지만, /var 같은 시스템 디렉토리 (루트 바로 아래에 있는 디렉토리)로 가버리면 계속해서 권한 문제가 발생함. 거부당함 ㅠ 암튼 결론은 시스템 디렉토리에선 파일을 생성하거나 쓸 때 권한 문제가 있으니까 주의를 잘 하자...


본 포스팅은 글로벌소프트웨어캠퍼스와 교보DTS가 함께 진행하는 챌린지입니다

profile
영차영차 😎

2개의 댓글

comment-user-thumbnail
2024년 9월 6일

첫 챌린지 참여 축하드립니다!! ㅎㅎㅎ 문제를 스스로 해결하시구 그 과정을 다른 분들과 공유해주시는 모습도 너무 멋집니다!!! 챗gpt 대신 뤼튼을 활용하신 이유도 궁금하네용~!!

1개의 답글