을 사용하여 데몬을 작성하려고합니다 bash
. 파트너의 IP 주소를 입력하면 연결이 시작됩니다 nc partner_ip 2015
. 마찬가지로 서버에서도 연결 시작을 사용할 것입니다 nc -l -p 2015
.
메시지가 전송될 때마다 내 이름을 인쇄하고 메시지 앞에 파트너의 이름을 인쇄하고 싶습니다. 따라서 먼저 파트너의 사용자 이름과 IP 주소를 알아내야 합니다.
#! /bin/bash
function readPip()
{
echo "Enter your partener IP"
read ip
export PIP= $ip
}
function readMip()
{
mip=ip addr list eth0 |grep "inet " |cut -d' ' -f6|cut -d/ -f1
echo -n "'my IP is"$mip"
export MIP=$mip
}
function chat()
{
[[ $PIP != " " ]]&& nc $PIP 2015
[[ $PIP == " " ]] && nc -l -p 2015
}
function testConnect()
{
nc $PIP 2015 > /dev/null
echo "am here"
return $1
}
readPip
testConnect
readMip
echo "$1"
답변1
function readPip()
{
echo "Enter your partener IP"
read ip
export PIP= $ip
}
등호 뒤의 공백은 구문 오류입니다. 그러나 그 이상으로 이 모든 것은 다음과 같이 리팩토링될 수 있습니다.
readPip () {
read -p "Enter your partner's IP: " PIP
}
export
이 변수에 액세스하기 위해 외부 하위 프로세스가 필요하지 않으므로 이는 필요하지 않습니다.
function readMip()
{
mip=ip addr list eth0 |grep "inet " |cut -d' ' -f6|cut -d/ -f1
echo -n "'my IP is"$mip"
export MIP=$mip
}
다시 말하지만, 여기에는 버그가 포함되어 있습니다. mip
값을 할당 ip
한 다음 명령을 실행하려고 시도합니다 addr list ...
. 분명히 의도는 실행 ip addr list ...
하고 결과를 에 할당하는 것입니다 MIP
.
readMip () {
ip addr list eth0 |grep "inet " |cut -d' ' -f6|cut -d/ -f1`
}
여기서는 할당을 호출자에게 맡깁니다( readPip
일관성을 위해 동일한 방식으로 리팩토링할 수 있음).
기본 코드에서 당신은
MIP=$(readMip)
다시 말하지만, 이것은 export
필요하지도 유용하지도 않습니다.
function chat()
{
[[ $PIP != " " ]]&& nc $PIP 2015
[[ $PIP == " " ]] && nc -l -p 2015
}
이는 분명히 "if - then - else"이므로 그에 따라 작성해야 합니다.
chat () {
if [[ "$PIP" == " " ]]; then
nc -l -p 2015
else
nc "$PIP" 2015
fi
}
심지어
[[ "$PIP" == " " ]] && nc -l -p 2015 || nc "$PIP" 2015
또한 Bash 전용 function
키워드를 제거했습니다. 여기에는 여전히 일부 Bashism이 있지만 POSIX 이식 가능한 스크립트로 쉽게 리팩토링될 수 있습니다.
답변2
nc
버퍼링되지 않은 호출로 다음 두 호출을 래핑합니다 sed
.
sed -u "s/^/My name: /" | nc PARTNER_IP 2015
sed -u "s/^/Partner name: /" | nc -l 2015