我在使用输出重定向时发现了csh的这种非常奇怪的行为。 我有以下脚本:令人费解的csh重定向行为
#! /bin/csh
set dirs = "."
set files = "`find "'"$dirs"'" -type f |& grep -v '^find: '`"
echo "-----------WITH &-----------------------"
echo "ARRAY:" $files
echo "FIRST ELEMENT FROM ARRAY1:" $files[1]
set files2 = "`find "'"$dirs"'" -type f`"
echo "------------WITHOUT &-----------------------"
echo "ARRAY2" $files2
echo "FIRST ELEMENT SECOND ARRAY" $files2[1]
现在,如果你运行它,一切正常。结果是:
-----------WITH &-----------------------
ARRAY: ./.netscape/preferences.js ...
FIRST ELEMENT FROM ARRAY1: ./.netscape/preferences.js
------------WITHOUT &-----------------------
ARRAY2 ./.netscape/preferences.js ...
FIRST ELEMENT SECOND ARRAY ./.netscape/preferences.js
但是当我运行像这样的csh -x test.csh(这是更大的脚本的一部分,所以我必须以某种方式调试它)我得到这样的:
set dirs = .
set files = `find "$dirs" -type f |& grep -v '^find: '`
grep -v ^find:
echo -----------WITH &-----------------------
-----------WITH &-----------------------
echo ARRAY: find . -type f ./.netscape/preferences.js ...
ARRAY: find . -type f ./.netscape/preferences.js ...
echo FIRST ELEMENT FROM ARRAY1: find . -type f
FIRST ELEMENT FROM ARRAY1: find . -type f <----WHY?
set files2 = `find "$dirs" -type f`
find . -type f
echo ------------WITHOUT &-----------------------
------------WITHOUT &-----------------------
echo ARRAY2 ./.netscape/preferences.js ...
ARRAY2 ./.netscape/preferences.js ...
echo FIRST ELEMENT SECOND ARRAY ./.netscape/preferences.js
FIRST ELEMENT SECOND ARRAY ./.netscape/preferences.js
现在,当调试时这会中断脚本。我觉得这种行为相当令人费解。有人可以解释为什么发生这种情况,以及如何避免它?
(。请勿张贴我不应该使用CSH无用的意见,认为它是垃圾我知道,但我的大学那种力量我使用它)
编辑:我所做的一切的建议由约翰C.我的输出是不同的。
bash2-2.05a$ csh -x test.csh 2>catch_stderr
-----------WITH &-----------------------
ARRAY: find . -type f ./test.csh ./ff.csh ./ff ./catch_stderr
FIRST ELEMENT FROM ARRAY1: find . -type f
------------WITHOUT &-----------------------
ARRAY2 ./test.csh ./ff.csh ./ff ./catch_stderr
FIRST ELEMENT SECOND ARRAY ./test.csh
bash2-2.05a$ cat catch_stderr
set dirs = .
set files = `find "$dirs" -type f |& grep -v '^find: '`
grep -v ^find:
echo -----------WITH &-----------------------
echo ARRAY: find . -type f ./test.csh ./ff.csh ./ff ./catch_stderr
echo FIRST ELEMENT FROM ARRAY1: find . -type f
set files2 = `find "$dirs" -type f`
find . -type f
echo ------------WITHOUT &-----------------------
echo ARRAY2 ./test.csh ./ff.csh ./ff ./catch_stderr
echo FIRST ELEMENT SECOND ARRAY ./test.csh
哪所大学?他们真的迫使你使用它,还是仅仅将它作为默认的交互式shell提供? – 2014-12-04 11:32:00
那么他们给我们两个选项使用CSH或BASH的一些古代版本。但是,如果你选择bash,那么你是独立的,因为讲座和练习中的每个例子都以csh解释。我不想给我的大学命名。 – J91321 2014-12-04 11:41:51
-x将它的输出发送到stderr。我认为你只是看到stdout和stderr混乱了一点。 – 2014-12-04 12:18:13