这必须是非常简单或非常复杂的,但我无法找到任何关于它...我试图打开一个新的bash的实例,然后运行它里面一些命令,并给出了控制权交还给用户内部的同一实例。
我试过了:
$ bash -lic "some_command"
但这会some_command
在新实例内部执行,然后将其关闭。我希望它保持打开状态。
还有一个细节可能会影响答案:如果我可以使用它,我.bashrc
将以别名的形式使用它,因此,alias
实现的奖励点!
这必须是非常简单或非常复杂的,但我无法找到任何关于它...我试图打开一个新的bash的实例,然后运行它里面一些命令,并给出了控制权交还给用户内部的同一实例。
我试过了:
$ bash -lic "some_command"
但这会some_command
在新实例内部执行,然后将其关闭。我希望它保持打开状态。
还有一个细节可能会影响答案:如果我可以使用它,我.bashrc
将以别名的形式使用它,因此,alias
实现的奖励点!
alias shortcut='bash -lic "some_command"'
在.bashrc中放入类似内容,然后运行shortcut
并运行一个some_command
已经运行的新shell 。
Answers:
bash --rcfile <(echo '. ~/.bashrc; some_command')
分配临时文件。在其他网站上的问题:
The system cannot find the file specified.
cat ~/.bashrc
有效吗?2)cat <(echo a)
有效吗?3)bash --rcfile somefile
有效吗?
bash.exe --rcfile ^<^(echo 'source $HOME/.bashrc; ls; pwd'^)
应从Windows命令提示符下运行。
sudo bash --init-file <(echo "ls; pwd")
或sudo -iu username bash --init-file <(echo "ls; pwd")
?
这是一个较晚的答案,但是我遇到了完全相同的问题,Google将该页面发送到了我,因此为了完整起见,我是如何解决该问题的。
据我所知,bash
没有选择来做原始海报想要做的事情。-c
执行命令后,该选项将始终返回。
无效的解决方案:围绕此问题最简单,最明显的尝试是:
bash -c 'XXXX ; bash'
这部分起作用(尽管有一个额外的子壳层)。但是,问题在于,尽管子外壳程序将继承导出的环境变量,但别名和函数不会被继承。因此,这可能对某些事情有用,但不是通用解决方案。
更好:解决此问题的方法是动态创建启动文件,并使用此新的初始化文件调用bash,并确保新的init文件~/.bashrc
在必要时调用常规文件。
# Create a temporary file
TMPFILE=$(mktemp)
# Add stuff to the temporary file
echo "source ~/.bashrc" > $TMPFILE
echo "<other commands>" >> $TMPFILE
echo "rm -f $TMPFILE" >> $TMPFILE
# Start the new bash shell
bash --rcfile $TMPFILE
令人高兴的是,临时init文件在使用后会立即删除,从而降低了无法正确清理的风险。
注意:我不确定/ etc / bashrc是否通常作为普通非登录shell的一部分来调用。如果是这样,您可能想同时获取/ etc / bashrc和您的~/.bashrc
。
rm -f $TMPFILE
事使得它。我实际上不记得我使用过的用例,现在我使用了更高级的自动化技术,但这是必须的方法!
bash --rcfile <(echo ". ~/.bashrc; a=b")
trap
。
您可以通过采购脚本而不是运行脚本来获得所需的功能。例如:
$ cat脚本 命令1 命令2 $。脚本 此时,$ cmd1和cmd2已在此shell中运行
alias=''
吗?
附加到这样~/.bashrc
的部分:
if [ "$subshell" = 'true' ]
then
# commands to execute only on a subshell
date
fi
alias sub='subshell=true bash'
然后,您可以使用来启动子外壳sub
。
env
效果。为了检查是否已定义,我使用echo $subshell
(而不是env | grep subshell
您使用的)。
接受的答案确实有帮助!只是为了补充一点,<(COMMAND)
在某些shell(例如)中不支持进程替换(例如dash
)。
就我而言,我试图在Thunar文件管理器中创建一个自定义操作(基本上是一个单行的shell脚本),以启动一个shell并激活所选的Python虚拟环境。我的第一次尝试是:
urxvt -e bash --rcfile <(echo ". $HOME/.bashrc; . %f/bin/activate;")
%f
Thunar处理的虚拟环境的路径在哪里。我收到一个错误(通过从命令行运行Thunar):
/bin/sh: 1: Syntax error: "(" unexpected
然后,我意识到我sh
(基本上是dash
)不支持流程替换。
我的解决方案是bash
在顶层调用以解释进程替换,但要付出额外的外壳程序代价:
bash -c 'urxvt -e bash --rcfile <(echo "source $HOME/.bashrc; source %f/bin/activate;")'
另外,我尝试将here-document用于,dash
但没有成功。就像是:
echo -e " <<EOF\n. $HOME/.bashrc; . %f/bin/activate;\nEOF\n" | xargs -0 urxvt -e bash --rcfile
附言:我没有足够的声誉来发表评论,主持人请随时将其移至评论,或者如果对该问题没有帮助,请将其删除。
根据daveraja的回答,这是一个bash脚本,可以解决该问题。
考虑一种情况,如果您使用的是C-shell,并且想要执行命令而不离开C-shell上下文/窗口,如下所示,
要执行的命令:仅在* .h,*。c文件中递归搜索当前目录中的确切单词“ Testing”
grep -nrs --color -w --include="*.{h,c}" Testing ./
解决方案1:从C-shell进入bash并执行命令
bash
grep -nrs --color -w --include="*.{h,c}" Testing ./
exit
解决方案2:将所需命令写入文本文件并使用bash执行
echo 'grep -nrs --color -w --include="*.{h,c}" Testing ./' > tmp_file.txt
bash tmp_file.txt
解决方案3:使用bash在同一行上运行命令
bash -c 'grep -nrs --color -w --include="*.{h,c}" Testing ./'
解决方案4:一次性创建一个密码,并将其用于以后的所有命令
alias ebash './execute_command_on_bash.sh'
ebash grep -nrs --color -w --include="*.{h,c}" Testing ./
脚本如下,
#!/bin/bash
# =========================================================================
# References:
# https://stackoverflow.com/a/13343457/5409274
# https://stackoverflow.com/a/26733366/5409274
# https://stackoverflow.com/a/2853811/5409274
# https://stackoverflow.com/a/2853811/5409274
# https://www.linuxquestions.org/questions/other-%2Anix-55/how-can-i-run-a-command-on-another-shell-without-changing-the-current-shell-794580/
# https://www.tldp.org/LDP/abs/html/internalvariables.html
# https://stackoverflow.com/a/4277753/5409274
# =========================================================================
# Enable following line to see the script commands
# getting printing along with their execution. This will help for debugging.
#set -o verbose
E_BADARGS=85
if [ ! -n "$1" ]
then
echo "Usage: `basename $0` grep -nrs --color -w --include=\"*.{h,c}\" Testing ."
echo "Usage: `basename $0` find . -name \"*.txt\""
exit $E_BADARGS
fi
# Create a temporary file
TMPFILE=$(mktemp)
# Add stuff to the temporary file
#echo "echo Hello World...." >> $TMPFILE
#initialize the variable that will contain the whole argument string
argList=""
#iterate on each argument
for arg in "$@"
do
#if an argument contains a white space, enclose it in double quotes and append to the list
#otherwise simply append the argument to the list
if echo $arg | grep -q " "; then
argList="$argList \"$arg\""
else
argList="$argList $arg"
fi
done
#remove a possible trailing space at the beginning of the list
argList=$(echo $argList | sed 's/^ *//')
# Echoing the command to be executed to tmp file
echo "$argList" >> $TMPFILE
# Note: This should be your last command
# Important last command which deletes the tmp file
last_command="rm -f $TMPFILE"
echo "$last_command" >> $TMPFILE
#echo "---------------------------------------------"
#echo "TMPFILE is $TMPFILE as follows"
#cat $TMPFILE
#echo "---------------------------------------------"
check_for_last_line=$(tail -n 1 $TMPFILE | grep -o "$last_command")
#echo $check_for_last_line
#if tail -n 1 $TMPFILE | grep -o "$last_command"
if [ "$check_for_last_line" == "$last_command" ]
then
#echo "Okay..."
bash $TMPFILE
exit 0
else
echo "Something is wrong"
echo "Last command in your tmp file should be removing itself"
echo "Aborting the process"
exit 1
fi
这是另一个(有效的)变体:
这将打开一个新的gnome终端,然后在新终端中运行bash。首先读取用户的rc文件,然后ls -la
在新的shell变为交互式之前将命令发送给新的shell执行。最后一个回显添加了完成执行所需的额外换行符。
gnome-terminal -- bash -c 'bash --rcfile <( cat ~/.bashrc; echo ls -la ; echo)'
我还发现有时装饰终端很有用,例如使用颜色以更好地定向。
gnome-terminal --profile green -- bash -c 'bash --rcfile <( cat ~/.bashrc; echo ls -la ; echo)'
$ bash --init-file <(echo 'some_command')
$ bash --rcfile <(echo 'some_command')
如果您不能或不想使用流程替换:
$ cat script
some_command
$ bash --init-file script
其他方式:
$ bash -c 'some_command; exec bash'
$ sh -c 'some_command; exec sh'
sh
仅方法(dash
,busybox
):
$ ENV=script sh
ENV=script
零件之前)除去或重新措词而受益,以避免与顶部答案的公然复制粘贴混淆。
ENV
+ sh
,但大多数情况下它们被埋在成堆的文本中,或者被不需要/不必要的代码包围。我相信,进行简短,清晰的总结将对所有人都有好处。