我有几个脚本可以启动与特定项目相关的所有应用程序和文件。但是,它会启动多个 emacs 实例,而不是简单地使当前的 emacs 打开请求的文件。我宁愿当前的 emacs 只是在新缓冲区中打开项目文本文件。
任何想法我怎么能做到这一点?
我已经阅读了这个问题和答案,但它并不适合我的问题,即使它很相似。
我正在编写一个脚本(称为 cpj),它将启动我当前的项目之一。我有大约 5 个。当我打字
$ cpj blah
我希望当前工作目录更改为 blah 项目目录(我保存在 $PROJDIR 中),并且我希望 emacsclient 打开该项目的主文件(我保存在 $MAINFILE 中)。
我引用的问题说你不能直接改变运行脚本的 shell 的环境,但你可以获取一个脚本,它会这样做。
为了测试这一点,我编写了一个 shell 脚本(称为 chcwd),其中有一行:
cd $1
如果,从命令行我做:
$ . chcwd $PROJDIR
我当前的工作目录将根据需要更改。另一方面,如果从我的 cpj 脚本中,我有相同的行:
. chcwd $PROJECT
它不会改变 shell 的当前工作目录。我意识到我正在运行 2 个脚本(cpj,然后是 chcwd),因此创建了 2 个 shell,但我看不出有什么办法可以完成我想要的。谁能告诉我如何实现我的目标?
我有一个包含在变量中的字符串,我想根据相对于另一个子字符串的位置提取子字符串。除非将字符串作为 arg 发送到函数,否则我的解决方案似乎有效。我正在使用 bash shell。
#!/usr/bin/bash
var0="-a check one two three"
var1="check"
function getsubstr() {
echo ${*#*"${2}"}
}
# this prints 'one two three' which is what I want
echo ${var0#*"${var1}"}
# this prints '-a one two three', not what I want.
getsubstr $var0
Run Code Online (Sandbox Code Playgroud)
请注意,当我放入echo $*
该getsubstr
函数时,它会打印与$var0
(-> '-a check one two Three')相同的字符串,而当我放入echo $2
该getsubstr
函数时,它会打印与$var1
(-> 'check')相同的字符串。因此,在我看来,我要求在两种情况下都打印相同的子字符串。
另一个难题是,如果不是echo ${*#*"${2}"}
在getsubstr
我使用的函数中echo ${*%"${2}"*}
,而是得到完全相同的结果。
任何帮助理解这种行为将不胜感激。
顺便说一句,我意识到 ${*:3}
在getsubstr
函数内部可以返回我想要的子字符串,但我试图理解 …
我的 TeX Live 安装有一个名为的文件.texlive2015
,最初设置为drwx------T
. 我改变了它,我想把它改回来,但我无法找回“T”。我如何取回它?
我想测试从文件中读入的一行是否具有特定的开头和结尾,其中包含保存在变量中的单词。这是一些代码:
输入文件是:
line one
#; line two
#; line three blah
line four
Run Code Online (Sandbox Code Playgroud)
失败的最小脚本是:
declare ENDOFLINE= "blah"
exec 3< "inputfile"
while read LINE <&3
do
if [[ ("$LINE" =~ "^#;") && (( ("$LINE" =~ "${ENDOFLINE%$}") )) ]];
then
echo score!
else echo no score
fi
done
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做:
if [[ ("$LINE" =~ "^#;") && (( ("$LINE" =~ "blah$") )) ]];
Run Code Online (Sandbox Code Playgroud)
它成功识别了正确的行(=> #;第三行等等)。换句话说,我需要一个复合测试条件,其中第一个测试是行首是否为“#;” 该行的结尾是包含在变量 $ENDOFLINE 中的字符串。
谢谢你的帮助。