我有一个脚本,用户可以在其中输入带空格的字符串。到目前为止,我有:
#bin/csh
echo "TEST 1"
echo -n "Input : "
set TEST = $<
echo "Var | " $TEST
set TEST=`echo $TEST`
echo "Var after echo | " $TEST
set TEST=`echo $TEST | sed 's/ /_/g'`
echo "Var after change | " $TEST
Run Code Online (Sandbox Code Playgroud)
如果我在“输入”中输入字符串“ rr r”,则$ TEST仅取“ r”。我希望能够将$ TEST设置为“ rr r”。这可能吗?如果输入“ 1 1 1”之类的字符串,则会出现错误:
设置:变量名必须以字母开头。
这是什么原因?
我将我公司的一个脚本从csh转换为Python时遇到问题.csh脚本调用别名命令,但是当我通过os.system()调用相同的别名命令时,它不起作用.
所以,如果foo是别名命令:
CSH脚本(这个工作,执行foo):
foo <argument>
Run Code Online (Sandbox Code Playgroud)
Python(这不起作用,错误声明foo是一个未知的命令):
os.system("foo <argument>")
Run Code Online (Sandbox Code Playgroud)
我认为在执行python脚本时必然会发生某种上下文切换,这会导致Python无法访问shell中创建的别名.阅读文档之后,似乎有人os.system赞成使用subprocess,并且subprocess有一个shell参数可能能够帮助我...问题是我被困在使用Python 2.3,subprocess直到版本2.4才可用.
我有想法在python中复制别名.所以,例如,说foo是别名cp.
CSH:
alias foo cp
foo file1 file2
Run Code Online (Sandbox Code Playgroud)
蟒蛇:
os.system("alias foo cp")
os.system("foo file1 file2")
Run Code Online (Sandbox Code Playgroud)
没有骰子......这里也有错误:
sh: line 0: alias: foo: not found
sh: line 0: alias: cp: not found
sh: foo: command not found
Run Code Online (Sandbox Code Playgroud)
我最后的努力是使用几行代码foo并将它们放入Python调用的自己的CSH脚本中.但如果有办法让这项工作不依赖于此,我很想知道它.
提前致谢!
我知道,我知道,我应该使用现代的shell ...无论如何,所以这里是别名:
alias p4client echo `p4 info | perl -ne 's/Client name: (.*)$/print $1/e'`
Run Code Online (Sandbox Code Playgroud)
我也知道可能有更好的方法来获取p4客户端名称.这只是一个例子.那么,当我调用别名而不是评估何时创建别名时,有人能告诉我一个很好的,干净的方法来评估这个吗?
我一直试图找到一种解决方法来在tcsh中广泛定义序列号列表,即.而不是做:
i = ( 1 2 3 4 5 6 8 9 10 )
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情(知道它不起作用)
i = ( 1..10 )
Run Code Online (Sandbox Code Playgroud)
这在foreach循环中特别有用(我知道我可以使用while,只是试图寻找替代方案).
环顾四周我发现了这个:
foreach $number (`seq 1 1 9`)
...
end
Run Code Online (Sandbox Code Playgroud)
发现在这里.他们说它会生成一个以1开头的数字列表,增量为1,以9结尾.
我尝试过,但它没有用.显然seq不是命令.它存在还是普遍错误?
还有其他想法吗?
我只是想做一件简单的事情.我在目录中获得了以下文件:
AppInterface.h baa PEMsg.h PluginInterface.h
Run Code Online (Sandbox Code Playgroud)
然后我发出命令:
ls | grep -v ".h" | rm -rf
Run Code Online (Sandbox Code Playgroud)
令我沮丧的是,baa不会被删除.但是这个:
ls | grep -v ".h"
Run Code Online (Sandbox Code Playgroud)
baa按照我的预期给出.所以我猜问题是如何rm输入,但我不知道为什么.在csh和bash中试过这个.
我正在寻找一个函数,如果存在一个shell命令将返回1,否则我知道有一个which命令返回命令的路径(如果存在).它还在手册中说该命令应该具有返回值,但是尝试set a = `which some_command.bin`不会输入任何值a.我知道我总是可以使用which然后解析结果,我只是在寻找一个更清洁的解决方案
我可以通过以下命令获得solaris机器的cpu Mhz.
% /usr/sbin/psrinfo -v | grep operate |head -1 | awk '{print $6}'
Run Code Online (Sandbox Code Playgroud)
1200
当我运行以下命令时,awk输出没有被重定向.
% csh -cf "/usr/sbin/psrinfo -v | grep operate |head -1 | awk '{print $6}' > myoutput"
% cat myoutput
Run Code Online (Sandbox Code Playgroud)
sparcv9处理器的工作频率为1200 MHz,
如何获得以下结果
% cat myoutput
Run Code Online (Sandbox Code Playgroud)
1200
这听起来非常容易,而且还有其他贝壳.但我似乎无法弄清楚如何获得回显来显示换行符.例如 -
cat myFile
Run Code Online (Sandbox Code Playgroud)
显示文件实际存在,这是我想要的 -
this
is
my
file
Run Code Online (Sandbox Code Playgroud)
而我的脚本,包含以下内容 -
#!/bin/csh
set var = `cat myFile`
echo "$var"
Run Code Online (Sandbox Code Playgroud)
删除所有换行符,这不是我想要的 -
this is my file
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我想在我的大学帐户中将bash设置为我的默认shell.
然而,传统的chsh方法在这里不起作用,因为大学的技术人员已经将其作为一个创业公司.但是,我可以通过bash从我的终端呼叫来调用bash .所以,我开发了一个小的hack,它允许我当前的shell csh通过修改我的~/.cshrc文件来自动启动bash,以便它从中调用bash.问题是,我希望以这样的方式设置它,当我退出我的bash会话时,我希望它也关闭它的父csh会话.我怎样才能做到这一点?
==编辑==
提醒:由于ajk警告过使用csh运行的脚本,我发现登录序列在该shell上精确完成的难点.我现在无法再登录我的机器了.我将不得不联系我的大学技术人员关于删除rc文件.我怀疑会让他们开心.:\
所以,请注意.
我通常使用csh(实际上,我的/ bin / csh链接到tcsh,这是csh的改进版本),并且经常!$用来指代最后一个命令的最后一个参数。
但是有时我想使用上two一个命令的最后一个参数。我怎样才能做到这一点?我想我可以访问任何先前命令的参数。
我已经阅读了如何回忆上一个bash命令的参数?但找不到答案。我们如何引用上一个命令的倒数第二个参数?
例如,如果我给了echo Tiger Rabbit,我如何在以下命令中引用Tiger?最好的答案是csh,但我也对bash情况感到好奇。