![쉘 스크립트에 명령 변수를 도입하면 작동하지 않습니다.](https://linux55.com/image/185410/%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%20%EB%AA%85%EB%A0%B9%20%EB%B3%80%EC%88%98%EB%A5%BC%20%EB%8F%84%EC%9E%85%ED%95%98%EB%A9%B4%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
이는 예상대로 정확하게 작동합니다.
echo -n 80 443 | xargs -d ' ' -I% bash -c 'socat TCP4-LISTEN:%,fork TCP4:123.123.123.123:% &'
하지만 이 버전은 아닙니다. $ip 변수를 전달할 수 없으므로 IP는 0.0.0.0이 됩니다.
ip=$(cat ip.txt)
echo -n 80 443 | xargs -d ' ' -I% bash -c 'socat TCP4-LISTEN:%,fork TCP4:$ip:% &'
예상대로 작동하게 하려면 어떻게 해야 합니까?
답변1
변수가 작은따옴표로 묶여 있기 때문에 작동하지 않습니다. 쉘은 작은 따옴표로 변수를 확장하지 않습니다. socat이 잘못된 IP를 발견하면 0.0.0.0을 사용하는 것 같습니다.
포트와 IP를 명령줄 인수로 bash 주체에 전달합니다.
ip=$(< ip.txt) # this is a bash builtin equivalent to $(cat ip.txt)
printf '%s\n' 80 443 | xargs -I% bash -c 'socat "TCP4-LISTEN:$1,fork" "TCP4:$2:$1" &' bash % "$ip"
두 번째 "bash"에는 $0이 할당됩니다.