我在shell脚本中有类似的东西
cd /some/folder1
savedCFLAGS=${CFLAGS-}
export CFLAGS="-fexceptions ${CFLAGS-}"
./configure --some-option -what-ever
make
export CFLAGS=${savedCFLAGS}
cd /some/folder2
./configure --some-option -what-ever
make
这或多或少正常工作但有一个严重的缺陷。
如果先前未设置CFLAGS,则在第一个块之后它将被设置并为空。
有时,这是一个问题,因为有些配置仅当变量实际未设置时,脚本才使用变量的默认值 - 如果变量只是空的,则不会使用默认值。
我还要说明我在脚本中有多次这样的构造,有多个不同的变量(这是一个用于构建完整的基于GCC的工具链的脚本)。
将变量恢复到之前的值(如果它实际上是先前设置的)或未设置(如果在我的修改之前未设置),最简单的方法是什么?
如果未设置,我可以将savedCFLAGS
设置为某个特殊标记,然后测试savedCFLAGS
是否具有等于该标记的值。
但是,也许有更简单的东西?
答案 0 :(得分:4)
使用括号在子shell中运行setenv + configure + make:
void Server::acceptorLoop()
{
acceptor = new boost::asio::ip::tcp::acceptor(service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 8001));//boost::asio::ip::address::from_string("xx.xx.xx.xx"), 80)
std::cout << "Waiting for clients..." << std::endl;
while (TRUE)
{
boost::asio::ip::tcp::socket* clientSock = new boost::asio::ip::tcp::socket (service);
acceptor->accept(*clientSock);
std::cout << "New client joined! " << std::endl;
Client* new_client = new Client; //create new client
new_client->clientSock = clientSock;
new_client->last_read_request = "";
new_client->activity = TRUE;
new_client->request_thread = new boost::thread(&Server::HandleRequest, this, new_client);//new thread with handling client requests
mtx.lock();
clients_list->push_back(new_client);
mtx.unlock();
std::cout << "Total clients:" << clients_list->size() << std::endl;
}
}
它在副本中继承了环境,因此当退出子shell时,你会得到完全相同的&#34;之前的&#34;州:没有环境。您的脚本中的变量都会发生变化,并且void Server::HandleRequest(Client * Client_to_handle)
{
int iterator = 0;
while (TRUE)
{
if (Client_to_handle->clientSock->available())
{
//do stuff and drop iterator to zero (connection active)
iterator = 0;
}
else if (iterator >= 10) //program refuses to get in here
{
if (iterator == 20)
{
Client_to_handle->clientSock->shutdown(boost::asio::ip::tcp::socket::shutdown_both);
Client_to_handle->clientSock->close();
Client_to_handle->activity = FALSE;
}
boost::asio::write(*Client_to_handle->clientSock, boost::asio::buffer("1|"));
}
boost::this_thread::sleep(boost::posix_time::millisec(1000));
}
}
命令可以正常运行。