mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Use default-shell for command prompt #() and popups as well
This commit is contained in:
		
							
								
								
									
										14
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								client.c
									
									
									
									
									
								
							| @@ -490,20 +490,10 @@ client_send_identify(const char *ttynam, const char *termname, char **caps, | ||||
| static __dead void | ||||
| client_exec(const char *shell, const char *shellcmd) | ||||
| { | ||||
| 	const char	*name, *ptr; | ||||
| 	char		*argv0; | ||||
| 	char	*argv0; | ||||
|  | ||||
| 	log_debug("shell %s, command %s", shell, shellcmd); | ||||
|  | ||||
| 	ptr = strrchr(shell, '/'); | ||||
| 	if (ptr != NULL && *(ptr + 1) != '\0') | ||||
| 		name = ptr + 1; | ||||
| 	else | ||||
| 		name = shell; | ||||
| 	if (client_flags & CLIENT_LOGIN) | ||||
| 		xasprintf(&argv0, "-%s", name); | ||||
| 	else | ||||
| 		xasprintf(&argv0, "%s", name); | ||||
| 	argv0 = shell_argv0(shell, !!(client_flags & CLIENT_LOGIN)); | ||||
| 	setenv("SHELL", shell, 1); | ||||
|  | ||||
| 	proc_clear_signals(client_proc, 1); | ||||
|   | ||||
							
								
								
									
										31
									
								
								job.c
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								job.c
									
									
									
									
									
								
							| @@ -79,19 +79,28 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e, struct sessio | ||||
| 	struct environ	 *env; | ||||
| 	pid_t		  pid; | ||||
| 	int		  nullfd, out[2], master; | ||||
| 	const char	 *home; | ||||
| 	const char	 *home, *shell; | ||||
| 	sigset_t	  set, oldset; | ||||
| 	struct winsize	  ws; | ||||
| 	char		**argvp, tty[TTY_NAME_MAX]; | ||||
| 	char		**argvp, tty[TTY_NAME_MAX], *argv0; | ||||
|  | ||||
| 	/* | ||||
| 	 * Do not set TERM during .tmux.conf, it is nice to be able to use | ||||
| 	 * if-shell to decide on default-terminal based on outside TERM. | ||||
| 	 * Do not set TERM during .tmux.conf (second argument here), it is nice | ||||
| 	 * to be able to use if-shell to decide on default-terminal based on | ||||
| 	 * outside TERM. | ||||
| 	 */ | ||||
| 	env = environ_for_session(s, !cfg_finished); | ||||
| 	if (e != NULL) | ||||
| 		environ_copy(e, env); | ||||
|  | ||||
| 	if (s != NULL) | ||||
| 		shell = options_get_string(s->options, "default-shell"); | ||||
| 	else | ||||
| 		shell = options_get_string(global_s_options, "default-shell"); | ||||
| 	if (!checkshell(shell)) | ||||
| 		shell = _PATH_BSHELL; | ||||
| 	argv0 = shell_argv0(shell, 0); | ||||
|  | ||||
| 	sigfillset(&set); | ||||
| 	sigprocmask(SIG_BLOCK, &set, &oldset); | ||||
|  | ||||
| @@ -107,10 +116,11 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e, struct sessio | ||||
| 	} | ||||
| 	if (cmd == NULL) { | ||||
| 		cmd_log_argv(argc, argv, "%s:", __func__); | ||||
| 		log_debug("%s: cwd=%s", __func__, cwd == NULL ? "" : cwd); | ||||
| 		log_debug("%s: cwd=%s, shell=%s", __func__, | ||||
| 		    cwd == NULL ? "" : cwd, shell); | ||||
| 	} else { | ||||
| 		log_debug("%s: cmd=%s, cwd=%s", __func__, cmd, | ||||
| 		    cwd == NULL ? "" : cwd); | ||||
| 		log_debug("%s: cmd=%s, cwd=%s, shell=%s", __func__, cmd, | ||||
| 		    cwd == NULL ? "" : cwd, shell); | ||||
| 	} | ||||
|  | ||||
| 	switch (pid) { | ||||
| @@ -152,7 +162,8 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e, struct sessio | ||||
| 		closefrom(STDERR_FILENO + 1); | ||||
|  | ||||
| 		if (cmd != NULL) { | ||||
| 			execl(_PATH_BSHELL, "sh", "-c", cmd, (char *) NULL); | ||||
| 			setenv("SHELL", shell, 1); | ||||
| 			execl(shell, argv0, "-c", cmd, (char *)NULL); | ||||
| 			fatal("execl failed"); | ||||
| 		} else { | ||||
| 			argvp = cmd_copy_argv(argc, argv); | ||||
| @@ -163,6 +174,7 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e, struct sessio | ||||
|  | ||||
| 	sigprocmask(SIG_SETMASK, &oldset, NULL); | ||||
| 	environ_free(env); | ||||
| 	free(argv0); | ||||
|  | ||||
| 	job = xmalloc(sizeof *job); | ||||
| 	job->state = JOB_RUNNING; | ||||
| @@ -196,12 +208,13 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e, struct sessio | ||||
| 		fatalx("out of memory"); | ||||
| 	bufferevent_enable(job->event, EV_READ|EV_WRITE); | ||||
|  | ||||
| 	log_debug("run job %p: %s, pid %ld", job, job->cmd, (long) job->pid); | ||||
| 	log_debug("run job %p: %s, pid %ld", job, job->cmd, (long)job->pid); | ||||
| 	return (job); | ||||
|  | ||||
| fail: | ||||
| 	sigprocmask(SIG_SETMASK, &oldset, NULL); | ||||
| 	environ_free(env); | ||||
| 	free(argv0); | ||||
| 	return (NULL); | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										18
									
								
								tmux.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								tmux.c
									
									
									
									
									
								
							| @@ -239,6 +239,24 @@ fail: | ||||
| 	return (NULL); | ||||
| } | ||||
|  | ||||
| char * | ||||
| shell_argv0(const char *shell, int is_login) | ||||
| { | ||||
| 	const char	*slash, *name; | ||||
| 	char		*argv0; | ||||
|  | ||||
| 	slash = strrchr(shell, '/'); | ||||
| 	if (slash != NULL && slash[1] != '\0') | ||||
| 		name = slash + 1; | ||||
| 	else | ||||
| 		name = shell; | ||||
| 	if (is_login) | ||||
| 		xasprintf(&argv0, "-%s", name); | ||||
| 	else | ||||
| 		xasprintf(&argv0, "%s", name); | ||||
| 	return (argv0); | ||||
| } | ||||
|  | ||||
| void | ||||
| setblocking(int fd, int state) | ||||
| { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 nicm
					nicm