Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Windows, Batch] Odpowiednik linuksowego ``

Ostatnio zmodyfikowano 2012-09-04 19:39
Autor Wiadomość
m4tx
» 2012-09-03 14:04:48
@up w ostateczności możesz zrobić coś takiego, że w cmd.exe wykonujesz sobie te pkg-configi, a potem dodajesz te opcje, które to Ci wyrzuci, do ustawień kompilatora i linkera. Aczkolwiek ładnie będziesz miał wtedy zawalone, zwłaszcza kompilator :P
P-64296
Mrovqa
Temat założony przez niniejszego użytkownika
» 2012-09-03 14:20:28
m4tx, to jest ten 'nieelegancki' sposób, o którym napisałem... Btw jest jeszcze jeden sposób, którego raczej nie uda mi się zrealizować (nie zamierzam), aczkolwiek jest możliwy - przechwytywanie wiersza poleceń/modyfikacja windowsowskiego interpretera (gyn jakoś zrobił swojego ansi hacka :D).
P-64297
DejaVu
» 2012-09-03 14:36:47
A co to za problem napisać własną aplikację i wywołać ją:
myapp echo `echo ble`
Istotą jest znalezienie rozwiązania, które jest standardowo wspierane przez system, a nie implementowanie własnych tricków.
P-64298
Mrovqa
Temat założony przez niniejszego użytkownika
» 2012-09-03 15:14:14
@up wiem, ale nie chodziło mi o własną aplikację (chodź muszę przyznać - fajny pomysł; może napiszę sobie taką 'nakładkę' na gcc), ale o modyfikację obsługi wiersza poleceń przez system (co pisałem, że robić nie będę :P).
P-64299
ison
» 2012-09-03 15:49:05
C/C++
#include <cstdio>
#include <string>
#include <windows.h>

int main( int argc, char ** argv )
{
    if( argc < 2 ) {
        printf( "No arguments given.\n" );
        return 0;
    }
    std::string command;
    for( int i = 1; i < argc; ++i ) {
        command += argv[ i ];
        if( i != argc - 1 ) command += ' ';
       
    }
    std::string output;
    int gravisIndex = - 1;
    for( size_t i = 0; i < command.size(); ++i ) {
        if( command[ i ] == '`' ) {
            if( gravisIndex >= 0 ) {
                TCHAR tempPath[ MAX_PATH ];
                DWORD tempPathRet = GetTempPath( MAX_PATH, tempPath );
               
                if( !tempPathRet || tempPathRet > MAX_PATH ) {
                    printf( "Getting temp path failed.\n" );
                    return 0;
                }
               
                std::string fileName = tempPath;
                fileName += tmpnam( NULL ) + 1;
                fileName += "tmp";
               
                std::string sys = command.substr( gravisIndex + 1, i - gravisIndex - 1 );
                sys = sys + " > " + fileName;
                system( sys.c_str() );
               
                FILE * file = fopen( fileName.c_str(), "r" );
                if( !file ) {
                    printf( "Opening temp file failed.\n" );
                    return 0;
                }
               
                char buff[ 100 ];
                while( !feof( file ) ) {
                    if( fgets( buff, 100, file ) ) {
                        output += buff;
                    }
                }
                fclose( file );
               
                while( output.size() &&( output[ output.size() - 1 ] == '\n' ||
                output[ output.size() - 1 ] == '\r' ||
                output[ output.size() - 1 ] == ' ' ) ) {
                    output = output.substr( 0, output.size() - 1 );
                }
               
                gravisIndex = - 1;
            }
            else gravisIndex = i;
           
        }
        else if( gravisIndex < 0 ) output += command[ i ];
       
    }
    system( output.c_str() );
}
rozwiązanie trochę brzydkie bo żeby pozyskać output muszę przekierowywać go do pliku tymczasowego i z niego czytać, zapewne jakoś się da pipe'ami to zrobić ładniej, ale grunt, że działa :D przynajmniej u mnie

program echo a
 -
a

program echo `echo a`
 -
a

program echo `echo 1``echo 2`abc
 -
12abc

tu kod normalnie sformatowany: http://pastebin.com/5JqtRHpy

(pod niektórymi kompilatorami trzeba ręcznie jakoś przekonwertować TCHAR* na char*, pod najnowszym mingw się nie czepia)
P-64302
pekfos
» 2012-09-03 18:10:19
Można też napisać program generujący makefile
P-64310
Mrovqa
Temat założony przez niniejszego użytkownika
» 2012-09-03 18:27:38
@ison dzięki, ale ja już zacząłem pisać własny programik ;) Co do zapisywania do pliku - myślałem o przekierowaniu strumienia gdzieś do pamięci (tylko jak to zrobić tak, by do stdout nic nie trafiło...).
@pekfos akurat w sprawie makefile to mam zaległości, nigdy tego nie używałem i nie wiem dokładnie co to jest, ale jakieś podstawowe pojęcie mam ;)

/edit:
Póki co zmodyfikowałem lekko kod isona. Ten sposób ma pewną wadę --> ec`echo ho` abc <-- normalnie pod linuxem główne polecenie można też złożyć, ale to żaden problem dla mnie ;) Ehh ten windows i jego konsola...

Btw jakby ktoś miał coś ciekawego związanego z głównym problemem, tj. odpowiednikiem operatora, to chętnie wysłucham :) Temat pozostawiam otwarty.
P-64312
ison
» 2012-09-03 21:24:15
Póki co zmodyfikowałem lekko kod isona. Ten sposób ma pewną wadę --> ec`echo ho` abc <-- normalnie pod linuxem główne polecenie można też złożyć, ale to żaden problem dla mnie ;) Ehh ten windows i jego konsola...
przecież u mnie też można ;)

ec`echo ho` abc
 -
abc
P-64326
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona