Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. check whether a script exists by script name
Forum Updated to NodeBB v4.3 + New Features

check whether a script exists by script name

Scheduled Pinned Locked Moved Solved General and Desktop
22 Posts 4 Posters 3.8k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • U user4592357

    @SGaist
    i have some env var set, e.g. "export PROG_DIR=/some/path/" which isn't in $PATH, and the script is available at $PROG_DIR/some_util.
    application is located some directory, why does that matter?
    e.g. current dir=/path/, running aaplication: ./sub-dir/app

    JonBJ Offline
    JonBJ Offline
    JonB
    wrote on last edited by JonB
    #5

    @user4592357
    If the current directory is /path/, and some_util is in $PROG_DIR (where $PROG_DIR is not /path/), going QFileInfo fileInfo("some_util"); is not going to find it. That will only look in whatever the current directory happens to be. And (unless you set it yourself) you don't know what it might be for an end user anyway; searching for a relative pathname is not good, unless you actually intend it only to look in the current directory.

    It sounds like you need to expand (the environment variable in) the $PROG_DIR/some_util to a full path if you expect to pass it to QFileInfo.

    U 1 Reply Last reply
    1
    • JonBJ JonB

      @user4592357
      If the current directory is /path/, and some_util is in $PROG_DIR (where $PROG_DIR is not /path/), going QFileInfo fileInfo("some_util"); is not going to find it. That will only look in whatever the current directory happens to be. And (unless you set it yourself) you don't know what it might be for an end user anyway; searching for a relative pathname is not good, unless you actually intend it only to look in the current directory.

      It sounds like you need to expand (the environment variable in) the $PROG_DIR/some_util to a full path if you expect to pass it to QFileInfo.

      U Offline
      U Offline
      user4592357
      wrote on last edited by
      #6

      @JonB
      ok, then why can i start the script with QProcess::startDetached(progName, args)?

      JonBJ Christian EhrlicherC 2 Replies Last reply
      0
      • U user4592357

        @JonB
        ok, then why can i start the script with QProcess::startDetached(progName, args)?

        JonBJ Offline
        JonBJ Offline
        JonB
        wrote on last edited by
        #7

        @user4592357
        Because it's on your PATH?

        What is the "script" anyway? Is it something interpreted by something which looks at that PROG_DIR environment variable? I don't recognise what is using a PROG_DIR environment variable?

        U 1 Reply Last reply
        1
        • U user4592357

          @JonB
          ok, then why can i start the script with QProcess::startDetached(progName, args)?

          Christian EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #8
          This post is deleted!
          1 Reply Last reply
          0
          • JonBJ JonB

            @user4592357
            Because it's on your PATH?

            What is the "script" anyway? Is it something interpreted by something which looks at that PROG_DIR environment variable? I don't recognise what is using a PROG_DIR environment variable?

            U Offline
            U Offline
            user4592357
            wrote on last edited by user4592357
            #9

            @JonB
            no the script isn't in $PATH.

            ok, so at first script isn't available: bash: some_util: command not found
            i set the env var: export PROG_DIR=/some/path/, now script is available: some_util
            when i do which some_util, i get the value of $PROG_DIR, i.e. /some/path/

            JonBJ 1 Reply Last reply
            0
            • Christian EhrlicherC Offline
              Christian EhrlicherC Offline
              Christian Ehrlicher
              Lifetime Qt Champion
              wrote on last edited by
              #10

              PROG_DIR is no env var which evaluates something to be available in PATH later on so it must be something special in your setup.

              1 Reply Last reply
              2
              • U user4592357

                @JonB
                no the script isn't in $PATH.

                ok, so at first script isn't available: bash: some_util: command not found
                i set the env var: export PROG_DIR=/some/path/, now script is available: some_util
                when i do which some_util, i get the value of $PROG_DIR, i.e. /some/path/

                JonBJ Offline
                JonBJ Offline
                JonB
                wrote on last edited by JonB
                #11

                @user4592357
                I will look around for PROG_DIR now, because I'm interested. EDIT Couldn't find it anywhere!

                Meanwhile, for your question, if some_util is not going to be in the current directory, then QFileInfo("some_util") is not going to find it. If it is found in $PROG_DIR then you will need to expand that environment variable in your code before passing to QFileInfo.

                OOI: can you show us what your PATH environment is before you do anything in a new terminal/shell? From what you described: Does bash allow $PROG_DIR to be "embedded" as an environment variable inside PATH??

                U 1 Reply Last reply
                0
                • JonBJ JonB

                  @user4592357
                  I will look around for PROG_DIR now, because I'm interested. EDIT Couldn't find it anywhere!

                  Meanwhile, for your question, if some_util is not going to be in the current directory, then QFileInfo("some_util") is not going to find it. If it is found in $PROG_DIR then you will need to expand that environment variable in your code before passing to QFileInfo.

                  OOI: can you show us what your PATH environment is before you do anything in a new terminal/shell? From what you described: Does bash allow $PROG_DIR to be "embedded" as an environment variable inside PATH??

                  U Offline
                  U Offline
                  user4592357
                  wrote on last edited by
                  #12

                  @JonB
                  okay i will use full path, that not a problem.

                  i have one more question, so that script actually outputs something, i'm calling it with QProcess::startDetached(progName, args) where args is the args for the script.
                  but since it has output, i wanna suppress it, so i added /dev/null:

                  const auto args = QStringList() <<
                  		... <<
                  		"> /dev/null 2>&1";
                  

                  but it is passed to the script and the script says it's an unknown/unexpected argument. what should i do?

                  JonBJ 1 Reply Last reply
                  0
                  • U user4592357

                    @JonB
                    okay i will use full path, that not a problem.

                    i have one more question, so that script actually outputs something, i'm calling it with QProcess::startDetached(progName, args) where args is the args for the script.
                    but since it has output, i wanna suppress it, so i added /dev/null:

                    const auto args = QStringList() <<
                    		... <<
                    		"> /dev/null 2>&1";
                    

                    but it is passed to the script and the script says it's an unknown/unexpected argument. what should i do?

                    JonBJ Offline
                    JonBJ Offline
                    JonB
                    wrote on last edited by JonB
                    #13

                    @user4592357
                    Once you start using symbols like >, 2>&1 you now cannot try to execute some_util directly. Those are interpreted by the (bash) shell. You will have to achieve a:

                    bash -c 'some_util ... > /dev/null 2>&1'
                    

                    so the executable is bash with two arguments, -c and some_util ... > /dev/null 2>&1 as a single-argument-string.

                    This is getting hairy, and probably not the best way to do it. Better use QProcess stdout/err redirection if that's what you need to achieve.

                    U 1 Reply Last reply
                    1
                    • JonBJ JonB

                      @user4592357
                      Once you start using symbols like >, 2>&1 you now cannot try to execute some_util directly. Those are interpreted by the (bash) shell. You will have to achieve a:

                      bash -c 'some_util ... > /dev/null 2>&1'
                      

                      so the executable is bash with two arguments, -c and some_util ... > /dev/null 2>&1 as a single-argument-string.

                      This is getting hairy, and probably not the best way to do it. Better use QProcess stdout/err redirection if that's what you need to achieve.

                      U Offline
                      U Offline
                      user4592357
                      wrote on last edited by
                      #14

                      @JonB
                      yes, i need to not have output from that script i'm calling. this didn't work, i still get the output:

                      QProcess process;
                      process.setStandardOutputFile(QProcess::nullDevice());
                      if (!process.startDetached(progName, args))
                      ...
                      JonBJ 1 Reply Last reply
                      0
                      • Christian EhrlicherC Offline
                        Christian EhrlicherC Offline
                        Christian Ehrlicher
                        Lifetime Qt Champion
                        wrote on last edited by
                        #15

                        @user4592357 said in check whether a script exists by script name:

                        !process.startDetache

                        QProcess::startDetached() is a static function - if you need something from the process, you have to use QProcess::start() as explained in the documentation

                        1 Reply Last reply
                        2
                        • SGaistS Offline
                          SGaistS Offline
                          SGaist
                          Lifetime Qt Champion
                          wrote on last edited by
                          #16

                          You're using this static overload which is not the same as this member function.

                          Interested in AI ? www.idiap.ch
                          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                          1 Reply Last reply
                          1
                          • U user4592357

                            @JonB
                            yes, i need to not have output from that script i'm calling. this didn't work, i still get the output:

                            QProcess process;
                            process.setStandardOutputFile(QProcess::nullDevice());
                            if (!process.startDetached(progName, args))
                            ...
                            JonBJ Offline
                            JonBJ Offline
                            JonB
                            wrote on last edited by JonB
                            #17

                            @user4592357
                            In addition to my learned colleague @Christian-Ehrlicher's excellent catch :)
                            You also need/should call setStandardErrorFile() (or use MergedChannels), in addition to your Output one.

                            1 Reply Last reply
                            0
                            • U Offline
                              U Offline
                              user4592357
                              wrote on last edited by
                              #18

                              thanks for the replies, now i have this and it works. is this code okay?

                              	QProcess process;
                              	process.closeReadChannel(QProcess::StandardOutput);
                              	process.start(progPath, args);
                              	while (!process.atEnd());
                              	process.close();
                              

                              also, why suppress errors? i'd like to see if the called program has any errors.

                              JonBJ 1 Reply Last reply
                              0
                              • U user4592357

                                thanks for the replies, now i have this and it works. is this code okay?

                                	QProcess process;
                                	process.closeReadChannel(QProcess::StandardOutput);
                                	process.start(progPath, args);
                                	while (!process.atEnd());
                                	process.close();
                                

                                also, why suppress errors? i'd like to see if the called program has any errors.

                                JonBJ Offline
                                JonBJ Offline
                                JonB
                                wrote on last edited by
                                #19

                                @user4592357 said in check whether a script exists by script name:

                                also, why suppress errors? i'd like to see if the called program has any errors.

                                You wrote

                                but since it has output, i wanna suppress it

                                and the code you chose to show had

                                "> /dev/null 2>&1"
                                

                                I was just translating what you wrote, where you are sending stderr to nowhere. It's up to you.

                                U 1 Reply Last reply
                                0
                                • JonBJ JonB

                                  @user4592357 said in check whether a script exists by script name:

                                  also, why suppress errors? i'd like to see if the called program has any errors.

                                  You wrote

                                  but since it has output, i wanna suppress it

                                  and the code you chose to show had

                                  "> /dev/null 2>&1"
                                  

                                  I was just translating what you wrote, where you are sending stderr to nowhere. It's up to you.

                                  U Offline
                                  U Offline
                                  user4592357
                                  wrote on last edited by
                                  #20

                                  @JonB
                                  okay. and above code is okay? specifically, the while (!process.atEnd()); part.

                                  JonBJ 1 Reply Last reply
                                  0
                                  • U user4592357

                                    @JonB
                                    okay. and above code is okay? specifically, the while (!process.atEnd()); part.

                                    JonBJ Offline
                                    JonBJ Offline
                                    JonB
                                    wrote on last edited by JonB
                                    #21

                                    @user4592357

                                    while (!process.atEnd());

                                    Lord, no, I didn't look! That would occupy all CPU time for parent process!

                                    If you want to do it synchronously that way you must at least use waitForFinished(), see the example & discussion at https://doc.qt.io/qt-5/qprocess.html#synchronous-process-api. It's not the best compared to asynchronous with signal/slot, but I haven't got time, again see the doc if you want to understand.

                                    U 1 Reply Last reply
                                    2
                                    • JonBJ JonB

                                      @user4592357

                                      while (!process.atEnd());

                                      Lord, no, I didn't look! That would occupy all CPU time for parent process!

                                      If you want to do it synchronously that way you must at least use waitForFinished(), see the example & discussion at https://doc.qt.io/qt-5/qprocess.html#synchronous-process-api. It's not the best compared to asynchronous with signal/slot, but I haven't got time, again see the doc if you want to understand.

                                      U Offline
                                      U Offline
                                      user4592357
                                      wrote on last edited by
                                      #22

                                      @JonB
                                      i see. thanks a lot

                                      1 Reply Last reply
                                      0

                                      • Login

                                      • Login or register to search.
                                      • First post
                                        Last post
                                      0
                                      • Categories
                                      • Recent
                                      • Tags
                                      • Popular
                                      • Users
                                      • Groups
                                      • Search
                                      • Get Qt Extensions
                                      • Unsolved