구글링 후 찾은 내용은 다음과 같습니다.
dpkg --list 'linux-image-*' \
| perl -ane 'BEGIN { $r = `uname -r` or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' \
| xargs -r aptitude purge -y
누군가 위의 세 줄을 하나로 결합해 줄 수 있나요? 한 번에 세 줄을 복사하는 것보다 한 줄을 복사하여 sudo 명령에 붙여넣는 것이 더 쉽다는 것을 알았습니다.
Hauke 지연의 경우: sudo 명령에 따라 한 번에 세 개의 구분선을 복사하려고 할 때 오류 메시지를 포함하도록 이 원본 게시물을 편집했습니다.
username@hostname:~$ sudo -i
[sudo] password for username:
root@hostname:~# dpkg --list 'linux-image-*' \
>
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-============-============-=================================
un linux-image-2. <none> (no description available)
un linux-image-2. <none> (no description available)
un linux-image-2. <none> (no description available)
un linux-image-2. <none> (no description available)
ii linux-image-3. 3.14.4-1~bpo amd64 Linux 3.14 for 64-bit PCs
ii linux-image-3. 3.2.57-3+deb amd64 Linux 3.2 for 64-bit PCs
ii linux-image-am 3.14+57~bpo7 amd64 Linux for 64-bit PCs (meta-packag
root@hostname:~# | perl -ane 'BEGIN { $r = `uname -r` or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' \
-bash: syntax error near unexpected token `|'
root@hostname:~#
root@hostname:~# | xargs -r aptitude purge -y
답변1
이 세 줄 중 하나를 선택할 필요는 없습니다. 개행 문자가 이스케이프되면 쉘은 이를 제거합니다 \
. 즉, 세 줄의 인수가 있는 명령은 세 줄이 아닌 한 줄만 "볼" 수 있습니다.
다음 질문은 다음과 같습니다.
sudo cmd1 | cmd2 | cmd3
루트로만 실행 됩니다 cmd1
. 당신은 다음과 같은 것을 할 수 있습니다
sudo bash -c 'cmd1 | cmd2 | cmd3'
그러나 이는 인용 짜증을 유발할 수 있습니다.
가장 간단한 해결책은 아마도 빈 파일을 만들고 여기에 세 줄을 복사한 후 실행하는 것입니다.
sudo bash file
|
안전한 줄 바꿈을 위해
|
줄 끝에 넣으시면 됩니다 . 이렇게 하면 (추가) 개행 문자가 문제가 되지 않습니다. 이 시도:
dpkg --list 'linux-image-*' |
perl -ane 'BEGIN { $r = `uname -r` or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' |
sudo xargs -r aptitude purge -y
답변2
백슬래시 줄 바꿈은 일반적으로 구문에서 줄 바꿈을 허용하지 않는 줄을 분할하여 제거할 수 있는 방법입니다.
dpkg --list 'linux-image-*' | perl -ane 'BEGIN { $r = `uname -r` or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' | xargs -r aptitude purge -y
sudo에서 실행하려면 sudo
해당 명령만 dpkg
루트로 실행할 수 있으므로 해당 줄을 복사하여 붙여넣을 수는 없습니다. 실제로 aptitude
루트로 실행하면 됩니다.
dpkg --list 'linux-image-*' | perl -ane 'BEGIN { $r = `uname -r` or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' | xargs -r sudo aptitude purge -y
이 명령의 기능은 너무 복잡합니다. Perl 스크립트는 설치된 일부 패키지를 필터링하지만 aptitude는 이 필터링을 완벽하게 수행할 수 있습니다.
sudo aptitude purge -y "~i ^linux-image !?exact-name(linux-image-$(uname -r))"
답변3
함수를 생성할 수도 있습니다(아래 참조).
~/MyPersonalFunctions
예를 들어 , 사용해야 하는 모든 기능을 추가할 파일에 넣을 수 있습니다 .
필요할 때만 명령을 사용하여 로드할 수 source ~/MyPersonalFunctions
있으며 확장된 기능 세트를 갖게 됩니다.
파일이 작성될 때마다 자동으로 source ~/MyPersonalFunctions
로드 할 수도 있습니다 ~/.bashrc
.
참고: 이 파일이 있는 전체 경로를 작성해야 합니다. 예를 들어 디렉토리에 넣으면 ) ~/bin
라고 씁니다 source ~/bin/MyPersonalFunctions
.
function PurgeKernels()
{
dpkg --list 'linux-image-*' \
| perl -ane 'BEGIN { $r = `uname -r` or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' \
| xargs -r sudo aptitude purge -y
}
function Cat(){ # Just to show you can put in the same file
echo Meow # more than one function... :-)
}
물론 이 페이지의 다른 답변에서 제안한 더 짧은 버전의 코드와 함께 사용할 수 있습니다.