我正在尝试编写一个定义某些别名的实用程序脚本。
我的 SHELL 是tcsh(不能改变)。
我尝试了以下
#!/bin/tcsh
alias log 'less ~/logs/log.`date '+%Y%m%d'`''
Run Code Online (Sandbox Code Playgroud)
然后我像这样运行它:
./myscript
log
Run Code Online (Sandbox Code Playgroud)
我得到的输出是: log: Command not found.
当然,如果我像这样运行它:
source myscript
log
Run Code Online (Sandbox Code Playgroud)
一切安好。
有什么方法可以不指定source ...吗?
这是这个问题的一些后续。我正在tcsh中的 GNU screen中的xterm 中工作。
我的 .cshrc 中有以下内容:
alias res_t 'xtset -t %h:%d "(%u:%g)" %e' # reset titlebar
res_t # reset title right now
alias precmd res_t
Run Code Online (Sandbox Code Playgroud)
这很好用!
但是,当我运行 screen 时,我看到标题没有随当前目录更新。如何让屏幕更新 xterm 标题?
我在运行长期(数周?)进程的 xterm 中有一个 tcsh 实例。它运行的 Xvnc 服务器在杂草中消失了;它消耗 100% 的 CPU 并且没有响应。(这是一个已知的错误,我知道它是不可恢复的。)
长期进程目前在标准输出上阻塞。
有什么办法可以杀死一个底层进程——tcsh、xterm 等等——并保持这个长期进程运行?
(拜托,没有关于 的答案screen。我知道。这不是我的过程;这是用户的。他们不会学习。)
我刚学的把戏设立cdpath的tcsh,它看起来非常有用的。
但是,似乎没有自动完成子文件夹名称。有什么技巧吗?因为我经常进入某些目录,所以这真的很酷。
我正在使用tcsh6.14.00 (Astron)。
我们公司使用red hat linux系统,在/home给大家分配一个账号。不幸的是,我们的系统正在使用 tsch,这对我不利。而且,由于我没有超级用户权限,我无法使用 chsh 命令为自己更改为 bash。更糟糕的是,我也无法使用 ypchsh。所以,最后,我将以下几行添加到 .cshrc 中:
bash
echo $0
Run Code Online (Sandbox Code Playgroud)
并适当配置 .bashrc(从原始 .cshrc 复制并修复必要的语法错误)。现在明显的 shell 变成了 bash(如“echo $0”命令所示)。
现在问题来了:
当我使用 vim 编辑一个 cpp 文件(例如 Hello_World),并在 vim 中使用“:!g++ -g Hello_World.cpp -o hw.out”编译文件时,不会显示任何结果,并且 vim 退出显示“bash”(当终端打开时),但没有通常的“敲击键”来回到我在 vim 中的工作。在 Hello_World.cpp 文件夹中,有一个 .Hello_World.cpp.swp 文件,但没有 hw.out。当再次vim Hello_World.cpp 时,发现这个cpp 文件已经打开了。
但是,如果我 g++ 文件夹中的 cpp 文件但不使用 vim 和 :!,则一切正常。实际上, :!现在似乎对 vim 来说是非法的。
如果我用原来的tcsh,一切也OK。
我该如何解决这个奇怪的错误?
提前感谢您的友好帮助。
清
顺便说一句:我更喜欢 bash 而不是 tcsh,主要是因为它具有 HISTIGNORE 和 HISTCONTROL 的便利性,尽管 tcsh 也有 histdup 设置。
我发现以下内容有点帮助,但仍然不能满足我的问题。
在bash我启动一个t/cshshell,它更新stty erase ^H.cshrc 中的 tty 输入 ( ),但是当exit-ing 并返回到 bash 时,backspace密钥不再起作用。这是因为 bash 使用readline,我需要重置擦除 ( stty erase ^?)。
如果我理解trap正确,似乎我可以从 t/csh 进程中捕获 t/csh 出口,并在它退出后运行命令。但是,我更喜欢在 bash 中进行捕获,理想情况下,它会检测到 shell 被调用/退出,然后运行脚本来重置其配置。
这是首选,因为我可以调用任意数量的外壳程序(例如,dash, zsh),这可能会无意中修改特定于 bash 的设置。与其trap为每个 shell维护多个命令,不如为 bash 设置一个命令。
我的理解trap正确吗?如果是这样,是否可以bash检测到子 shell 退出然后运行脚本?
我想从 tcsh 命令行执行以下操作,最好在 1 行中:
build_cmd1 &
build_cmd2 &
build_cmd3 &
wait until all parallel build commands finish
regression_cmd
Run Code Online (Sandbox Code Playgroud)
也就是说,我想分叉出一堆构建命令,阻塞直到它们退出,然后再运行另一个命令。我想从 tcsh 命令行执行此操作。
在将命令粘贴到运行 TC shell (/bin/tcsh) 的终端应用程序(最大 OS X 10.5.8)中时,我遇到了 1024 个字符限制问题。
这可以通过将以下命令粘贴到终端应用程序中来一致地重现:
回声 0 0 0 0 0 回声 1 1 1 1 1 回声 2 2 2 2 2 回声 3 3 3 3 3 回声 4 4 4 4 4 回声 5 5 5 5 5 回声 6 6 6 6 6 回声 7 7 7 7 7 回声 8 8 8 8 8 回声 9 9 9 9 9 回声 10 10 10 10 10 回声 11 11 …
我\xe2\x80\x99m是tcsh的长期用户,但现在所有的酷孩子似乎都在使用bash或zsh(也就是说,git或其他东西的完成模式可用于bash和zsh,很少用于tcsh)。
\n\n我的问题是,两个 shell 都有关于路径制表符补全的行为,这让我发疯,而且 I\xe2\x80\x99m 很难找到如何将它们更改为我喜欢的方式。
\n\n这里\xe2\x80\x99s 是我\xe2\x80\x99m 过去在 tcsh 中所做的一些与其他人不同的操作的示例:
\n\n/u<TAB>完成到/usr/ /usr/ /usr/li<TAB>完成/usr/lib并列出lib/和libexec/ /usr/lib/ /usr/lib/在 bash 中,无论我点击多少次 tab,它都不会过去/usr/lib,需要我输入斜杠,而我不想这样做。
在 zsh 中,/usr/li<TAB>首先完成 to /usr/lib,然后另一个选项卡列出lib/和libexec/,第三次选项卡完成 to /usr/lib/,所有后续选项卡在/usr/lib/和 之间循环/usr/libexec/。我不知道如何度过这一点。我只想从/usr/li到/usr/lib,然后/usr/lib/,然后列出其内容。
对于Python来说也是如此。在 tcsh 中,我输入pyt<TAB>,它完成 …
作为我正常工作流程的一部分,我 SSH 到另一个用户的机器,将用户切换到他们,运行命令,然后再次退出到我自己的机器:
ssh hostname
sudo su user
runcommand
exit
exit
Run Code Online (Sandbox Code Playgroud)
有没有办法将其缩减为单行命令?例如
ssh --someflags "runcommand"
Run Code Online (Sandbox Code Playgroud)
我试过这个,但提示输入我没有的其他用户的密码:
sudo ssh user@hostnme "runcommand"
Run Code Online (Sandbox Code Playgroud)