diff --git a/src/qcam/main.cpp b/src/qcam/main.cpp
index d3f01a85..91166be5 100644
--- a/src/qcam/main.cpp
+++ b/src/qcam/main.cpp
@@ -43,6 +43,9 @@ OptionsParser::Options parseOptions(int argc, char *argv[])
 			 "Set configuration of a camera stream", "stream", true);
 	parser.addOption(OptVerbose, OptionNone,
 			 "Print verbose log messages", "verbose");
+	parser.addOption(OptCaptureScript, OptionString,
+			 "Load a capture session configuration script from a file",
+			 "script", ArgumentRequired, "script");
 
 	OptionsParser::Options options = parser.parse(argc, argv);
 	if (options.isSet(OptHelp))
diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index f2e3c576..d6ad0083 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -100,7 +100,7 @@ private:
 
 MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)
 	: saveRaw_(nullptr), options_(options), cm_(cm), allocator_(nullptr),
-	  isCapturing_(false), captureRaw_(false)
+	  isCapturing_(false), captureRaw_(false), firstCameraSelect_(true)
 {
 	int ret;
 
@@ -146,6 +146,9 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)
 	cm_->cameraAdded.connect(this, &MainWindow::addCamera);
 	cm_->cameraRemoved.connect(this, &MainWindow::removeCamera);
 
+	if (options_.isSet(OptCaptureScript))
+		scriptPath_ = options_[OptCaptureScript].toString();
+
 	/* Open the camera and start capture. */
 	ret = openCamera();
 	if (ret < 0) {
@@ -324,6 +327,13 @@ void MainWindow::loadCaptureScript()
 		QMessageBox::critical(this, "Invalid Script",
 				      "Couldn't load the capture script");
 
+		/*
+		 * Close the camera if started by command line and its the first capture
+		 * script.
+		 */
+		if (firstCameraSelect_ && options_.isSet(OptCaptureScript))
+			quit();
+
 	} else
 		cameraSelectorDialog_->informScriptRunning(scriptPath_);
 
@@ -347,8 +357,10 @@ std::string MainWindow::chooseCamera()
 	 * Use the camera specified on the command line, if any, or display the
 	 * camera selection dialog box otherwise.
 	 */
-	if (options_.isSet(OptCamera))
+	if (firstCameraSelect_ && options_.isSet(OptCamera)) {
+		firstCameraSelect_ = false;
 		return static_cast<std::string>(options_[OptCamera]);
+	}
 
 	if (cameraSelectorDialog_->exec() == QDialog::Accepted) {
 		std::string cameraId = cameraSelectorDialog_->getCameraId();
diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
index 887f1db1..3a264f96 100644
--- a/src/qcam/main_window.h
+++ b/src/qcam/main_window.h
@@ -46,6 +46,7 @@ enum {
 	OptRenderer = 'r',
 	OptStream = 's',
 	OptVerbose = 'v',
+	OptCaptureScript = 256,
 };
 
 class MainWindow : public QMainWindow
@@ -123,6 +124,7 @@ private:
 	/* Capture state, buffers queue and statistics */
 	bool isCapturing_;
 	bool captureRaw_;
+	bool firstCameraSelect_;
 	libcamera::Stream *vfStream_;
 	libcamera::Stream *rawStream_;
 	std::map<const libcamera::Stream *, QQueue<libcamera::FrameBuffer *>> freeBuffers_;
