xargs에서 변수를 두 번 반복하는 방법


21

이 예제에서 두 번째 에코를 테스트하여 에코 출력하는 방법은 무엇입니까?

 echo test  | xargs -I {} echo {} && echo {}
xargs 

var=test & echo $var ...
alexus

xargs -I {} var = {} echo $ var && echo $ var 당신에게 줄 것입니다 : 그러한 파일이나 디렉토리가 없습니다.

답변:


27

{}명령에 두 번 쓰 십시오. 다음과 같이 작동합니다.

$ echo test | xargs -I {} echo {} {}
test test

문제는 명령이 중첩되는 방식 입니다. 이것을 보자.

echo test | xargs -I {} echo {} && echo {}

bash 가 실행 echo test | xargs -I {} echo {}됩니다. 성공적으로 실행되면 echo {}실행됩니다. 중첩을 변경하려면 다음과 같이 할 수 있습니다.

echo test | xargs -I {} sh -c "echo {} && echo {}"

그러나이 방법을 사용하면 코드 삽입이 발생하기 쉬워 질 수 있습니다. "test"가 쉘 코드로 대체되면 실행됩니다. 따라서 인수를 사용하여 입력을 중첩 된 쉘에 전달해야합니다.

echo test | xargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}

3
파일 콜로드가 문자 그대로인 경우 마지막 코드에서 예기치 않은 결과가 발생합니다 $(rm -f *). 더 낫습니다xargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Kusalananda

@ Kusalananda, 감사합니다. 나는 문제를 알고 있었지만 그 순간에 간단한 해결책을 생각할 수 없었습니다. 귀하의 제안을 답변에 통합했습니다.
JojOatXGME

5

또 다른 옵션은 사용하는 것입니다 -i같은 인 플래그 -I{}(그것은 교체가 함께 제공됩니다 것을 의미한다 {})

$ echo test | xargs -i echo {} {}

1
그 동안 : This option is deprecated; use -I instead.가 매뉴얼에 추가되었습니다 man xargs.
Jonathan Komar

0

나를 위해 소문자 만 작동합니다. 디렉토리에 수백 개의 이미지가 있고 소스를 목록으로 가져 오기를 원했습니다. 대문자 i -I옵션이 작동하지 않았습니다. 소문자 만 버전 차이로 인해 발생했을 수 있습니다. 이 이미지들은 모두 같은 이름을 가졌습니다 Daniel_(somenumber).jpg.

이 구문은 효과가 있습니다.

ls -l | tr -s ' ' ':'| cut -d: -f9 | xargs -i echo "img src='"{}"'alt='{}'"

보고:

src='Daniel_248.jpg' alt='Daniel_248.jpg'
...

리눅스 버전 4.14.96-hw + # 80 SMP x86_64 GNU / Linux


2
더 읽기 쉽도록 답변에 서식을 추가했습니다. 제대로 이해했으면합니다.
fra-san
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.