시스템 튜토리얼 리눅스 초보자부터 숙련자까지 Linux 리디렉션 및 파이프라인 도구를 배워 작업 흐름 속도를 높이세요!

초보자부터 숙련자까지 Linux 리디렉션 및 파이프라인 도구를 배워 작업 흐름 속도를 높이세요!

Feb 09, 2024 pm 11:36 PM
linux 리눅스 튜토리얼 리눅스 시스템 리눅스 운영체제 리눅스 명령 쉘 스크립트 임베디드리눅스 리눅스 시작하기 리눅스 학습

업무 효율성 향상, 운영 체제 최적화, 자동화 등은 모든 IT 실무자가 추구하는 목표입니다. Linux 운영 체제에서는 리디렉션 및 파이프라인 명령줄 도구를 능숙하게 사용할 수 있는 능력이 숙달되어야 하는 기술 중 하나입니다. 이 문서에서는 예제를 통해 리디렉션 및 파이프라인 도구의 사용법과 원리를 자세히 설명합니다.

저는 Linux 시스템을 매우 좋아합니다. 특히 Linux의 일부 디자인은 매우 아름답습니다. 예를 들어 일부 복잡한 문제는 여러 개의 작은 문제로 분해될 수 있고 파이프 문자 및 리디렉션을 통해 기성 도구를 사용하여 유연하게 해결할 수 있습니다. 메커니즘. 쉘 스크립트를 작성하는 것은 매우 효율적입니다.

초보자부터 숙련자까지 Linux 리디렉션 및 파이프라인 도구를 배워 작업 흐름 속도를 높이세요!

이 기사에서는 실제로 리디렉션 및 파이프 문자를 사용할 때 직면한 몇 가지 함정을 공유할 것입니다. 몇 가지 기본 원칙을 이해하면 스크립트 작성 효율성이 크게 향상될 수 있습니다.

> 및 >> 리디렉션 문자

의 함정

먼저 첫 번째 질문부터 이야기해 보겠습니다. 다음 명령을 실행하면 어떻게 될까요?

으아악

같은 파일을 읽고 쓰면 아무 일도 일어나지 않을 것 같죠?

실제로 위 명령을 실행한 결과는 file.txt 파일의 내용이 지워지는 것입니다.

PS: 일부 Linux 배포판에서는 catfile.txt를 실행하여 이 감지를 우회할 수 있습니다.

Linux 프로세스 및 파일 설명자에 대한 이전 기사에서 언급한 것처럼 프로그램 자체는 표준 입력/출력 지점이 어디인지 신경 쓸 필요가 없습니다. 리디렉션 기호.

따라서 cat file.txt > file.txt 명령을 실행하면 쉘은 먼저 file.txt를 엽니다. 리디렉션 기호가 >이므로 파일 내용이 지워진 다음 쉘은 다음의 표준 출력을 설정합니다. cat 명령을 .txt 파일로 전송하면 cat 명령이 실행되기 시작합니다.

즉, 다음과 같은 과정이 있습니다:

1. 쉘은 file.txt를 열고 내용을 지웁니다.
2. 쉘은 cat 명령의 표준 출력을 file.txt 파일로 지정합니다.
3. 쉘은 cat 명령을 실행하고 빈 파일을 읽습니다.
4. cat 명령은 표준 출력(file.txt 파일)에 빈 문자열을 씁니다.

그래서 최종 결과는 file.txt가 빈 파일이 되는 것입니다.

우리는 > ​​대상 파일을 지우고 >>가 대상 파일 끝에 내용을 추가한다는 것을 알고 있으므로 리디렉션 기호 >가 >>?로 변경되면 어떻게 될까요?

으아악

먼저 file.txt에 한 줄의 내용이 기록됩니다. cat file.txt >> file.txt를 실행한 후 예상되는 결과는 두 줄의 내용이어야 합니다.

하지만 안타깝게도 실행 결과는 예상과 다릅니다. 대신 무한 루프에서 file.txt에 계속해서 hello world를 작성하게 되며, 파일은 곧 매우 커질 것이며 Ctrl+C로만 명령을 중지할 수 있습니다.

흥미롭네요. 무한 루프가 존재하는 이유는 무엇일까요? 사실 약간의 분석을 통해 그 이유를 생각해 볼 수 있습니다.

먼저 cat 명령의 동작을 기억해 보세요. cat 명령만 실행하면 Enter 키를 누를 때마다 키보드 입력이 읽혀집니다. cat 명령은 하나씩 데이터를 읽은 다음 출력합니다.

이후 cat file.txt >> file.txt 명령의 실행 과정은 다음과 같습니다.

1. file.txt를 열고 파일 끝에 내용을 추가할 준비를 합니다.
2. cat 명령의 표준 출력이 file.txt 파일을 가리키도록 합니다.
3. cat 명령은 file.txt의 내용 한 줄을 읽고 이를 표준 출력에 씁니다(file.txt 파일에 추가).
4. 방금 데이터 줄이 기록되었으므로 cat 명령은 file.txt에 아직 읽을 수 있는 내용이 있음을 확인하고 3단계를 반복합니다.

위 프로세스는 목록을 순회하는 동시에 목록에 요소를 추가하는 것과 같습니다. 완전히 순회할 수 없으므로 명령이 무한 루프로 이어집니다.

> 리디렉션 문자와 | 파이프 문자가 함께 작동합니다

파일의 처음 XX줄을 가로채서 나머지 부분을 삭제해야 하는 경우가 종종 있습니다.

Linux에서 head 명령은 파일의 처음 몇 줄을 가로채는 기능을 완료할 수 있습니다.

으아악

파일의 처음 두 줄을 유지하고 나머지 줄을 삭제하려면 다음 명령을 사용할 수 있습니다.

으아악

그러나 이렇게 하면 위에서 언급한 실수가 발생하게 되어 결국 file.txt가 지워져 우리의 요구 사항을 충족할 수 없게 됩니다.

그러면 다음과 같이 명령을 작성하면 함정을 피할 수 있을까요?

으아악

결론은 작동하지 않으며 파일 내용은 여전히 ​​지워진다는 것입니다.

파이프라인에 누출이 있어서 모든 데이터가 손실되나요?

Linux 프로세스 및 파일 설명자에 대한 이전 기사에서 파이프 문자의 구현 원리에 대해서도 언급했습니다. 기본적으로 두 명령의 표준 입력과 출력을 연결하여 이전 명령의 표준 출력이 표준 입력 역할을 합니다. 다음 명령의.

그러나 이렇게 명령을 작성하면 예상한 결과를 얻을 수 있다고 생각한다면 파이프 문자로 연결된 명령이 순차적으로 실행된다고 생각하기 때문일 수 있습니다. 실제로 여러 명령이 파이프로 연결되는 경우가 많습니다. 문자가 병렬로 실행됩니다.

셸이 먼저 cat file.txt 명령을 실행하고 정상적으로 file.txt의 모든 내용을 읽은 다음 이 내용을 파이프를 통해 head -n 2 > file.txt 명령에 전달한다고 생각할 수도 있습니다.

이때 file.txt의 내용은 지워지지만 head는 파일에서 데이터를 읽지 않고 파이프에서 데이터를 읽으므로 file.txt에 두 줄의 데이터를 올바르게 쓰는 것이 가능할 것입니다.

但实际上,上述理解是错误的,shell 会并行执行管道符连接的命令,比如说执行如下命令:

$ sleep 5 | sleep 5 
로그인 후 복사

shell 会同时启动两个sleep进程,所以执行结果是睡眠 5 秒,而不是 10 秒。

这是有点违背直觉的,比如这种常见的命令:

$ cat filename | grep 'pattern' 
로그인 후 복사

直觉好像是先执行cat命令一次性读取了filename中所有的内容,然后传递给grep命令进行搜索。

但实际上是cat和grep命令是同时执行的,之所以能得到预期的结果,是因为grep ‘pattern’会阻塞等待标准输入,而cat通过 Linux 管道向grep的标准输入写入数据。

执行下面这个命令能直观感受到cat和grep是在同时执行的,grep在实时处理我们用键盘输入的数据:

$ cat | grep 'pattern' 
로그인 후 복사

说了这么多,再回顾一开始的问题:

$ cat file.txt | head -n 2 > file.txt 
로그인 후 복사

cat命令和head会并行执行,谁先谁后不确定,执行结果也就不确定。

如果head命令先于cat执行,那么file.txt就会被先清空,cat也就读取不到任何内容;反之,如果cat先把文件的内容读取出来,那么可以得到预期的结果。

不过,通过我的实验(将这种并发情况重复 1w 次)发现,file.txt被清空这种错误情况出现的概率远大于预期结果出现的概率,这个暂时还不清楚是为什么,应该和 Linux 内核实现进程和管道的逻辑有关。

解决方案

说了这么多管道符和重定向符的特点,如何才能避免这个文件被清空的坑呢?

最靠谱的办法就是不要同时对同一个文件进行读写,而是通过临时文件的方式做一个中转。

比如说只保留file.txt文件中的头两行,可以这样写代码:

# 先把数据写入临时文件,然后覆盖原始文件

$ cat file.txt | head -n 2 > temp.txt && mv temp.txt file.txt
로그인 후 복사

这是最简单,最可靠,万无一失的方法。

你如果嫌这段命令太长,也可以通过apt/brew/yum等包管理工具安装moreutils包,就会多出一个sponge命令,像这样使用:

# 先把数据传给 sponge,然后由 sponge 写入原始文件 
$ cat file.txt | head -n 2 | sponge file.txt 
로그인 후 복사

sponge这个单词的意思是海绵,挺形象的,它会先把输入的数据「吸收」起来,最后再写入file.txt,核心思路和我们使用临时文件时类似的,这个「海绵」就好比一个临时文件,就可以避免同时打开同一个文件进行读写的问题。

在Linux操作系统中,重定向和管道是非常有用的命令行工具,可以让我们更好地掌握系统的运行状态和信息。掌握相关技能能够帮助我们更好地进行系统优化和自动化工作,从而更好地提高工作效率。相信通过本文的介绍,读者对重定向和管道的原理和使用方法都有了更为深入的了解。

위 내용은 초보자부터 숙련자까지 Linux 리디렉션 및 파이프라인 도구를 배워 작업 흐름 속도를 높이세요!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Centos와 Ubuntu의 차이 Centos와 Ubuntu의 차이 Apr 14, 2025 pm 09:09 PM

Centos와 Ubuntu의 주요 차이점은 다음과 같습니다. Origin (Centos는 Red Hat, Enterprise의 경우, Ubuntu는 Debian에서 시작하여 개인의 경우), 패키지 관리 (Centos는 안정성에 중점을 둡니다. Ubuntu는 APT를 사용하여 APT를 사용합니다), 지원주기 (Ubuntu는 5 년 동안 LTS 지원을 제공합니다), 커뮤니티에 중점을 둔다 (Centos Conciors on ubuntu). 튜토리얼 및 문서), 사용 (Centos는 서버에 편향되어 있으며 Ubuntu는 서버 및 데스크탑에 적합), 다른 차이점에는 설치 단순성 (Centos는 얇음)이 포함됩니다.

Centos를 설치하는 방법 Centos를 설치하는 방법 Apr 14, 2025 pm 09:03 PM

CentOS 설치 단계 : ISO 이미지를 다운로드하고 부팅 가능한 미디어를 실행하십시오. 부팅하고 설치 소스를 선택하십시오. 언어 및 키보드 레이아웃을 선택하십시오. 네트워크 구성; 하드 디스크를 분할; 시스템 시계를 설정하십시오. 루트 사용자를 만듭니다. 소프트웨어 패키지를 선택하십시오. 설치를 시작하십시오. 설치가 완료된 후 하드 디스크에서 다시 시작하고 부팅하십시오.

유지 보수를 중단 한 후 Centos의 선택 유지 보수를 중단 한 후 Centos의 선택 Apr 14, 2025 pm 08:51 PM

Centos는 중단되었으며 대안은 다음과 같습니다. 1. Rocky Linux (Best Compatibility); 2. Almalinux (Centos와 호환); 3. Ubuntu 서버 (구성 필수); 4. Red Hat Enterprise Linux (상업용 버전, 유료 라이센스); 5. Oracle Linux (Centos 및 Rhel과 호환). 마이그레이션시 고려 사항은 호환성, 가용성, 지원, 비용 및 커뮤니티 지원입니다.

Docker Desktop을 사용하는 방법 Docker Desktop을 사용하는 방법 Apr 15, 2025 am 11:45 AM

Docker Desktop을 사용하는 방법? Docker Desktop은 로컬 머신에서 Docker 컨테이너를 실행하는 도구입니다. 사용 단계는 다음과 같습니다. 1. Docker Desktop 설치; 2. Docker Desktop을 시작하십시오. 3. Docker 이미지를 만듭니다 (Dockerfile 사용); 4. Docker Image 빌드 (Docker 빌드 사용); 5. 도커 컨테이너를 실행하십시오 (Docker Run 사용).

Docker 원리에 대한 자세한 설명 Docker 원리에 대한 자세한 설명 Apr 14, 2025 pm 11:57 PM

Docker는 Linux 커널 기능을 사용하여 효율적이고 고립 된 응용 프로그램 실행 환경을 제공합니다. 작동 원리는 다음과 같습니다. 1. 거울은 읽기 전용 템플릿으로 사용되며, 여기에는 응용 프로그램을 실행하는 데 필요한 모든 것을 포함합니다. 2. Union 파일 시스템 (Unionfs)은 여러 파일 시스템을 스택하고 차이점 만 저장하고 공간을 절약하고 속도를 높입니다. 3. 데몬은 거울과 컨테이너를 관리하고 클라이언트는 상호 작용을 위해 사용합니다. 4. 네임 스페이스 및 CGroup은 컨테이너 격리 및 자원 제한을 구현합니다. 5. 다중 네트워크 모드는 컨테이너 상호 연결을 지원합니다. 이러한 핵심 개념을 이해 함으로써만 Docker를 더 잘 활용할 수 있습니다.

Centos 후해야 할 일은 유지 보수를 중단합니다 Centos 후해야 할 일은 유지 보수를 중단합니다 Apr 14, 2025 pm 08:48 PM

Centos가 중단 된 후 사용자는 다음과 같은 조치를 취할 수 있습니다. Almalinux, Rocky Linux 및 Centos 스트림과 같은 호환되는 분포를 선택하십시오. Red Hat Enterprise Linux, Oracle Linux와 같은 상업 분포로 마이그레이션합니다. Centos 9 Stream : 롤링 분포로 업그레이드하여 최신 기술을 제공합니다. Ubuntu, Debian과 같은 다른 Linux 배포판을 선택하십시오. 컨테이너, 가상 머신 또는 클라우드 플랫폼과 같은 다른 옵션을 평가하십시오.

Docker 이미지가 실패하면해야 할 일 Docker 이미지가 실패하면해야 할 일 Apr 15, 2025 am 11:21 AM

실패한 Docker 이미지 빌드에 대한 문제 해결 단계 : Dockerfile 구문 및 종속성 버전을 확인하십시오. 빌드 컨텍스트에 필요한 소스 코드 및 종속성이 포함되어 있는지 확인하십시오. 오류 세부 사항에 대한 빌드 로그를보십시오. -표적 옵션을 사용하여 계층 적 단계를 구축하여 실패 지점을 식별하십시오. 최신 버전의 Docker Engine을 사용하십시오. -t [image-name] : 디버그 모드로 이미지를 빌드하여 문제를 디버깅하십시오. 디스크 공간을 확인하고 충분한 지 확인하십시오. 빌드 프로세스에 대한 간섭을 방지하기 위해 Selinux를 비활성화하십시오. 커뮤니티 플랫폼에 도움을 요청하고 Dockerfiles를 제공하며보다 구체적인 제안을 위해 로그 설명을 구축하십시오.

VSCODE에 필요한 컴퓨터 구성 VSCODE에 필요한 컴퓨터 구성 Apr 15, 2025 pm 09:48 PM

대 코드 시스템 요구 사항 : 운영 체제 : Windows 10 이상, MacOS 10.12 이상, Linux 배포 프로세서 : 최소 1.6GHz, 권장 2.0GHz 이상의 메모리 : 최소 512MB, 권장 4GB 이상의 저장 공간 : 최소 250MB, 권장 1GB 및 기타 요구 사항 : 안정 네트워크 연결, Xorg/Wayland (LINUX)

See all articles