실행 중인 쉘이 없는 환경이 있어서 리디렉션, 파이프, 여기 문서 또는 기타 쉘 주의를 사용할 수 없다고 가정해 보겠습니다.할 수 있는시작 명령(경유execvp
또는 비슷한 방식). 명명된 파일에 임의의 문자열을 쓰고 싶습니다. 다음을 수행하는 표준 명령이 있습니까?
somecommand outputfile 'string'
예를 들어:
somecommand /proc/sys/net/ipv4/ip_forward '1'
매우 어리석은 예는 다음과 같습니다.
curl -o /proc/sys/net/ipv4/ip_forward http://example.com/1.txt
그 안에 내가 원하는 문자열을 포함하도록 1.txt를 설정했습니다.
이를 위해 남용될 수 있는 일반적인 명령이 있습니까?
답변1
시스템에 비어 있지 않은 다른 파일이 있으면 다음을 사용하십시오.POSIXsed
:
sed -e 's/.*/hello world/' -e 'wtarget' -e q otherfile
GNU sed
와 비어 있지 않은 파일을 사용하면 다음을 사용할 수 있습니다.
sed -i.bak -e '$ihello world' -e 'd' foo
BSD의 경우 sed
다음과 같이 작동합니다.
sed -i.bak -e '$i\
hello world' -e d foo
쉘을 사용하지 않는 경우 개행 문자는 문제가 되지 않을 수 있습니다.
그리고ex
, 대상 파일이 존재하는 경우:
ex -c '0,$d' -c 's/^/hello world/' -c 'x' foo
이는 파일의 모든 내용을 삭제하고 첫 번째 줄을 "hello world"로 바꾼 다음 쓰고 종료합니다. vi
대체를 사용하여 동일한 작업을 수행 할 수 있습니다 ex
. 구현 시 여러 옵션을 지원할 필요는 없지만 -c
일반적으로 지원됩니다. 많은 ex
구현의 경우 파일이 이미 존재할 필요는 없습니다.
반품그리고awk
:
awk -v FN=foo -v STR="hello world" 'BEGIN{printf(STR) > FN }'
"foo" 파일에 "hello world"를 씁니다.
기존 파일에 알려진 위치에 원하는 바이트가 포함되어 있는 경우 여러 명령을 통해 파일을 바이트 단위로 조합할 수 있습니다 dd
(이 경우 alphabet
알파벳이 포함되어 있지만 입력 파일이 혼합될 수 있음).
dd if=alphabet bs=1 skip=7 count=1 of=test
dd if=alphabet bs=1 skip=4 count=1 seek=1 of=test
dd if=alphabet bs=1 skip=11 count=1 seek=2 of=test
dd if=alphabet bs=1 skip=11 count=1 seek=3 of=test
dd if=alphabet bs=1 skip=14 count=1 seek=4 of=test
cat test
hello
그러면 루틴이 제대로 cp
작동하거나 이미 시작하기에 적합한 위치에 있을 수도 있습니다.
덜 일반적으로,mispipe
moreutils의 명령셸리스 파이프라인 구축을 허용합니다.
mispipe "echo 1" "tee wtarget"
동일 echo 1 | tee wtarget
하지만 종료 코드를 반환합니다 echo
. 이는 다음을 사용합니다.system()
이것내부적으로는 그렇지 않습니다엄격하게쉘이 존재해야 합니다.
마지막으로, 다른 범용 스크립트 언어 perl
와 마찬가지로 명령줄에서 원하는 작업을 수행하는 임의의 프로그램을 작성할 수 있는 범용 명령이 있습니다 . python
마찬가지로, 쉘이 "실행 중"이 아니지만 존재한다면 sh -c 'echo 1 > target'
제대로 작동할 것입니다.
답변2
당신이 사용할 수있는 awk
:
awk 'BEGIN {print "Hello" > "/tmp/file"}'
awk
프로그램에 명령문이 하나만 포함되어 있으면 BEGIN
입력을 처리하지 않고 해당 명령문만 해석합니다.
매개변수화할 수도 있습니다.
awk -v text="World" -v file="/tmp/main" 'BEGIN {print text > file}'
이 구문을 사용하더라도 백슬래시 문자를 이스케이프해야 합니다. 다음을 사용하는 데 문제가 없습니다 ARGV
.
awk 'BEGIN {print ARGV[1] > ARGV[2]}' World /tmp/main