쩔쩔매면서 리눅스 명령어 하나씩 공부 중...
파일과 디렉토리 3 부분이었나... 여기를 공부하다가 문제가 생겼다.
이런식으로 뒤쪽 명령어에서 허가 거부
가 뜨는 명령어들을 만남. 왜!!!! 왜안돼!!!!
최초의 의문은 아래 명령어였음.
최고의 ai 뤼튼에게 질문했더니 얻은 답은 이거다. 그렇게 나와 첫 만남을 가진 tee
명령어...
뤼튼이 알려준 대로 명령어를 입력하니 올바르게 실행이 되었다. 하지만 이게 왜 되는건지 너무 궁금해진 거임. 그래서 잘 모르는 명령어들에 대해서 검색해보고 적어보기로 함. 고렇게 나의 첫 교보DTS TIL 게시물 결정...!
>>
?사실 일단 이것부터 몰랐어용. 걍 꺽쇠... 옆으로 가란건가? 대가리만 벅벅 긁으면서 걍 씀. 그리고 뤼튼에게 질문을 하다보면 표준입력이라는 말을 굉장히 많이 듣게된다. 입력이면 그냥 입력이지 표준을 왜 붙이는것... 표준이 아닌 입력도 있나...
표준입력에 대한 설명은 이 링크를 참고했다.
표준 스트림(standard stream)
→ 운영 체제에서 기본적으로 제공하는 추상화된 입출력 장치
표준 스트림 | 설명 |
---|---|
표준 입력(STDIN) | 표준 입력 장치의 ID는 숫자로는 0이며 일반적으로는 키보드가 된다 |
표준 출력(STDOUT) | 출력을 위한 스트림, ID는 1이며 일반적으로는 현재 쉘을 실행한 콘솔(console))이나 터미널이 된다 |
표준 에러(STDERR) | 에러를 위한 스트림, ID는 2, 일반적으로는 표준출력과 동일하다 |
표준..이라는 말을 참 좋아하는구나...
말이 어려웠지만, 그냥 내가 키보드에 인풋을 넣는게 표준입력이 되는거고, 그 결과가 터미널 창이나 콘솔에 보여지는 것을 표준 출력이라고 하는 것이었다.
>
, >>
→ append 명령어!막연하게 다음순서~,,, 를 가리키는 명령어일까 추측했는데 전혀 아니었음. 이것은 입력을 저장하여 출력하는 것과 관련이 있는 명령어였다.
차이점은 저장 방식이다.
>
: 지정한 파일에 덮어쓰기로 저장>>
: 이어쓰기로 저장 |
)기본적으로 리눅스 명령어 실습을 하다보면 명령어 두 개 정도를 조합해서 사용을 많이 하게 된다.
우리가 명령어를 사용해 입력을 하면, 그에 대한 결과가 출력되어 모니터에 나타난다. 첫 번째 명령어를 실행해서 나온 결과를 뒤에 나오는 명령어가 납!치! 해서 해당 명령어의 표준 입력으로 낚아채어 보내는 것을 리다이렉션이라고 한다.
명령어의 입력 - 실행 - 결과 이 흐름을 리눅스에서는 파이프라고 하는 것 같다. 그래서 첫 번째 명령어의 파이프 결과를 바로 출력하지 않고, 다른 명령어 파이프로 흘러가도록 연결해주는 명령어가 바로 |
이다.
tee
본론으로 드디어 왔군... tee 명령어가 과연 무엇일까?!
자꾸 나도 모르게 tree라고 읽게됨...
파이프와 유사하지만, 한 가지 일을 더 한다. 명령어 파이프를 연결해주는 것은 동일하다.
예시로 바로 설명하겠음!
echo
명령어로 표준 입력이 들어온다.
파이프(|
)로 연결되어 있기 때문에 에코 명령어 파이프의 출력 결과는 납치된다!
이 다음 tee
명령어의 역할 👉 앞에서 받아온 표준 출력을 모니터에 출력해준다. 따라서 test 계정에 암호를 입력하고 나면 echo
명령어로 실행한 결과인 'Addtional log entry'가 화면에 출력되게 된다.
-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가 함께 진행하는 챌린지입니다
첫 챌린지 참여 축하드립니다!! ㅎㅎㅎ 문제를 스스로 해결하시구 그 과정을 다른 분들과 공유해주시는 모습도 너무 멋집니다!!! 챗gpt 대신 뤼튼을 활용하신 이유도 궁금하네용~!!