标签: tcsh

使用变量隐藏的根前缀完成Tcsh和/或bash目录

我试图在tcsh和/或bash中设置目录完成(两者都在我的网站上使用)稍微扭曲:对于特定命令"foo",我想完成使用自定义函数来匹配first/-deimited term到实际子树节点,然后按照正常目录完成任何连续的术语.它是cdpath和completion的组合,或者我想一种目录完成形式,其中起点由完成脚本控制.它的工作原理如下:

$ foo xxx<TAB>
(custom completion function produces choices it finds at arbitrary levels in the dir tree)
xxxYYY xxxZZZ xxxBLAH ...
foo xxxYYY/<TAB>
(normal directory completion proceeds from this point on, to produce something like:)
foo scene/shot/element/workspace/user/...
Run Code Online (Sandbox Code Playgroud)

我们想这样做是因为我们有一个大型的生产开发树(这是一个CGI生产设施),精通外壳的用户一直在导航和跳跃.抱怨是树的上层是繁琐和多余的; 他们只需要在第一个学期快速搜索,找到可能的"头部"选择并从那里完成目录.似乎可编程完成可以提供一种方法来实现这一点,但它变得相当难以捉摸.

我做了几次自定义bash和tcsh完成的尝试,但是我得到的最接近的是一种"单词完成"形式,用户必须将目录级别视为带空格的单独单词(例如foo scene/shot)/element/workspace/...).我可以继续攻击我目前的脚本 - 但我一直想知道是否有一些我不理解的东西 - 这是我第一次尝试完成程序,而且这些文档和示例在shell书籍和互联网上相当薄弱.如果有任何完成大师可以让我走上正轨,我会很感激.

FWIW:这是我到目前为止所得到的(首先是tcsh,然后是bash).请注意,静态根"/ root/sub1/sub2/sub3"只是搜索功能的占位符,可以在不同级别找到不同的匹配项.如果我可以让它工作,我可以稍后进入搜索功能.同样,两个示例都执行单词完成,这需要用户在每个匹配的术语后键入一个空格(我还必须删除函数中的空格以构造实际路径,哎呀!)

TCSH示例(注意该函数实际上是一个bash脚本):

complete complete_p2 'C@*@`./complete.p2.list.bash $:1 $:2 $:3 $:4 $:5 $:6 $:7 $:8 $:9`@@'

#!/bin/bash --norc

# complete.p2.list.bash - Completion prototype "p2" for shotc command

# Remove spaces from input arguments
ppath=`echo …
Run Code Online (Sandbox Code Playgroud)

bash tcsh tab-completion bash-completion

7
推荐指数
1
解决办法
1912
查看次数

Python中的tcsh

我对tcsh没有多少经验,但我对学习很感兴趣.我一直在让Python看到PYTHONPATH.我可以回显$ PYTHONPATH,这是正确的,但是当我启动Python时,我的路径不会出现在sys.path中.有任何想法吗?

编辑:

[dmcdonal@tg-steele ~]$ echo $PYTHONPATH
/home/ba01/u116/dmcdonal/PyCogent-v1.1

>>> from sys import path
>>> from os import environ
>>> path
['', '/apps/steele/Python-2.5.2/lib/python2.5/site-packages/setuptools-0.6c8-py2.5.egg', '/apps/steele/Python-2.5.2/lib/python2.5/site-packages/FiPy-2.0-py2.5.egg', '/apps/steele/Python-2.5.2', '/apps/steele/Python-2.5.2/lib/python25.zip', '/apps/steele/Python-2.5.2/lib/python2.5', '/apps/steele/Python-2.5.2/lib/python2.5/plat-linux2', '/apps/steele/Python-2.5.2/lib/python2.5/lib-tk', '/apps/steele/Python-2.5.2/lib/python2.5/lib-dynload', '/apps/steele/Python-2.5.2/lib/python2.5/site-packages', '/apps/steele/Python-2.5.2/lib/python2.5/site-packages/Numeric']
>>> environ['PYTHONPATH']
'/apps/steele/Python-2.5.2'
Run Code Online (Sandbox Code Playgroud)

python tcsh

6
推荐指数
1
解决办法
3893
查看次数

SETENV:错误:$($)中的修饰符

我在Linux中使用tcsh终端.在我通常使用的另一个终端中,我将路径设置为某个许可证文件,如下所示:

  export PATH="$PATH:$MODEL_TECH"
Run Code Online (Sandbox Code Playgroud)

Tcsh shell无法识别此命令,因此我尝试了以下操作:

  setenv PATH "$PATH:$MODEL_TECH"
  set PATH "$PATH:$MODEL_TECH"
  setenv PATH=("$PATH:$MODEL_TECH")
Run Code Online (Sandbox Code Playgroud)

但后来我总是得到以下错误:

坏:$($)中的修饰符.

如果有人能够快速帮助我,尝试了很多组合但没有任何作用,这也很棒.

linux tcsh setenv

6
推荐指数
2
解决办法
2万
查看次数

tcsh - 在命令后立即保存历史记录

我尝试在每次输入命令后在tcsh中保存历史记录,而不是在"exit"命令之后保存它.这是因为通常我会同时打开10个标签,之后我只关闭终端窗口,而不是在每个标签中键入"exit".结果是仅为最后一个选项卡保存历史记录.当我关闭终端窗口时,此解决方案不起作用:https://stackoverflow.com/a/3577709/2773143.

因为我没有找到只使用历史命令的解决方案,所以我尝试通过不同的方式解决它:直接将每个命令回显到〜/ .tcsh_history并set histfile= ~/.tcsh_history.tcshrc文件中进行设置.但是我也没有办法做到这一点.我想在.alias所有命令中做一个别名,比如alias * '*; ~/someScript.tcsh(有许多其他版本),但它没有用.我发现如何通过对每个命令执行不同的别名来使其工作,但它有点难看.
例如:
alias cd 'cd \!*; ~/saveHist.tcsh \!:0 \!*'
alias grep 'grep \!*; ~/saveHist.tcsh \!:0 \!*'
(etc)
和〜/ saveHist.tcsh文件中:

#!/bin/tcsh -f

echo "$argv" >> ~/.tcsh_history
Run Code Online (Sandbox Code Playgroud)

但是当然这有点难看,这样一些命令会在关闭窗口后在〜/ .tcsh_history中写两次.

有任何想法吗?

terminal tcsh

6
推荐指数
2
解决办法
2648
查看次数

在emacs中使用ansi-term时出现换行符的问题

我试图在emacs中使用ansi-term(配置为tcsh shell).我看到显示换行符的一些问题.如果我从终端(ansi-term)尝试以下操作,我会得到正确的输出:

myterm > echo "Line1"; echo "Line2"; echo "Line3";    
Line1
Line2
Line3
myterm >
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试在shell脚本中添加相同的行并尝试从ansi-term执行脚本,则输出错误

脚本:(测试)

#!/usr/bin/env tcsh
echo "Line1"; echo "Line2"; echo "Line3";
Run Code Online (Sandbox Code Playgroud)

运行脚本(测试):

myterm > ./test
Line1
     Line2
          Line3
               myterm >
Run Code Online (Sandbox Code Playgroud)

注意:/ usr/bin/env tcsh指向正确的shell(它与我在调用ansi-term时使用的shell相同).从gnome-terminal执行脚本也会显示正确的输出.我也试过设置以下变量,但它没有解决我的问题:

(set-terminal-coding-system 'utf-8-unix)
(setq default-process-coding-system '((utf-8-unix . utf-8-unix)))
Run Code Online (Sandbox Code Playgroud)

emacs shell terminal tcsh ansi-term

6
推荐指数
1
解决办法
982
查看次数

优雅地停止 Docker 容器

我在理解容器停止时如何进行一些清理时遇到了一些麻烦。

为方便起见,我准备了一个示例来重现该问题。

以下是我的文件内容:

文件

FROM opensuse:latest

# Install tcsh (non-interactive mode)
RUN zypper -n in tcsh

# Create user
RUN useradd -ms /bin/tcsh dummyuser

# Set the user
USER dummyuser

# Change Working Dir
WORKDIR /home/dummyuser

# Copy entrypoint script
COPY docker-entrypoint.sh $HOME

# Starter Script
ENTRYPOINT ["./docker-entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

docker-entrypoint.sh

#!/bin/tcsh

echo "Starting"

onintr cleanup

# Running something in foreground, otherwise the container will stop
while (1)
   sleep 1000
end
exit 0

cleanup:
   onintr -
   echo "cleanup on going"
   exit 0 …
Run Code Online (Sandbox Code Playgroud)

signals tcsh docker dockerfile

6
推荐指数
1
解决办法
5829
查看次数

破管不再结束程序?

当您管道两个进程并在管道的"输出"处终止该进程时,第一个进程用于接收"Broken Pipe"信号,该信号通常也会终止它.比如跑步

$> do_something_intensive | less
Run Code Online (Sandbox Code Playgroud)

然后退出较少用于立即返回到SuSE8或以前版本的响应shell.当我今天尝试时,do_something_intensive显然仍在运行,直到我手动杀死它.似乎某些事情发生了变化(glib?shell?),这使得程序忽略了"破碎的管道"......

你们中的任何人都有这方面的暗示吗?如何恢复以前的行为?为什么它已被改变(或为什么它总是存在多个语义)?

编辑:进一步测试(使用strace的)揭示了"SIGPIPE" 生成,但该程序不被中断.一个简单的

#include <stdio.h>
int main() 
{
   while(1) printf("dumb test\n");
   exit(0);
}
Run Code Online (Sandbox Code Playgroud)

将继续无止境

--- SIGPIPE (Broken pipe) @ 0 (0) ---
write(1, "dumb test\ndumb test\ndumb test\ndu"..., 1024) = -1 EPIPE (Broken pipe)
Run Code Online (Sandbox Code Playgroud)

被杀害.我可以肯定在我的程序中编写一个信号处理程序并确保它终止,但我更需要一些环境变量或shell选项来强制程序在SIGPIPE上终止

再次编辑:它似乎是一个特定于tcsh的问题(bash正确处理它)和终端依赖(Eterm 0.9.4)

linux shell broken-pipe tcsh

5
推荐指数
2
解决办法
6958
查看次数

为shell脚本指定名称=值对等命令行参数

是否可以将命令行参数作为名称值对传递给shell脚本,例如

myscript action=build module=core
Run Code Online (Sandbox Code Playgroud)

然后在我的脚本中,获取变量 $action并处理它?

我知道$ 1 ....等等可以用来获取变量,但是不会像对子那样是名称值.即使它们是,但使用该脚本的开发人员必须负责以相同的顺序声明变量.我不要那个.

shell tcsh

5
推荐指数
2
解决办法
1万
查看次数

tcsh中的多行变量

我想在tcsh中有变量来保存我的脚本的使用信息,所以在我的脚本中,每当我写echo echo使用时,它都会打印

my_script
  -h : -help
  -b : do boo
Run Code Online (Sandbox Code Playgroud)

etc`.

有没有办法做到这一点?可以使用<< EOF完成吗?

我尝试过类似的东西,但失败了:

set help =  << EOF
     my_script 
       -h : print help
       -b : do boo
EOF
Run Code Online (Sandbox Code Playgroud)

谢谢

csh tcsh

5
推荐指数
1
解决办法
8031
查看次数

检查字符串是否与 tcsh 中的某个模式匹配

我尝试将用户输入的字符串与特定模式匹配,确切地说,我想检查字符串是否以大写字母开头,然后以任何大写、小写字母或数字开头。我想在 tcsh 中执行此操作,我知道 bash 更好用,但我必须使用 tcsh。

所以基本上我希望在 tcsh 中有以下内容:

if [[ $name =~ ^[A-Z][A-Za-z0-9]*$ ]]
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我的代码:

    #!/bin/tcsh
    set name
    while ( $name == "" )
       echo 'Give an account name!'
       set name = $<
       if ( $name =~ '^[A-Z][A-Za-z0-9*$]' ) then
           echo 'Name accepted!'
       else
           echo 'Not correct format!'
           set name = ""
       endif
    end
Run Code Online (Sandbox Code Playgroud)

我一直在“其他”部分结束。非常感谢你的帮助!

tcsh

5
推荐指数
1
解决办法
1万
查看次数