恢复以前的值或取消设置环境变量

时间:2016-10-22 09:55:59

标签: bash shell environment-variables

我在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是否具有等于该标记的值。
但是,也许有更简单的东西?

1 个答案:

答案 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)); } } 命令可以正常运行。