2014-11-12 6 views
1

내가 FISH (친절한 대화 형 쉘)검사는 argv 디렉토리

을 사용하고 있는데 나는이 개 기능을 만든 경우 :

function send 
    command cat $argv | nc -l 55555 
end 

을 ->

function senddir 
    command tar cjf copy.tar $argv; cat copy.tar | nc -l 55555; rm copy.tar 
end 
NC

를 통해 파일을 보내이

-> nc를 통해 압축하여 dir을 보냅니다.

이제 리팩터링을하지 않고 둘 다 수행하는 보내기 기능을 만들지 않아도됩니다. argv가 dir인지 확인하십시오. 물고기로 어떻게 할 수 있습니까?

답변

2

다른 쉘과 동일하지만 에는 실제로 쉘이 아닌 외부 프로그램이 사용됩니다.

function send 
    if test -d $argv 
     command tar cjf copy.tar $argv; cat copy.tar | nc -l 55555; rm copy.tar 
    else 
     command cat $argv | nc -l 55555 
    end 
end 

사실, 당신은 임시 파일을 필요로하지 않는 파이프 할 수 있습니다 당신이 $argv이라고

function send 
    if test -d $argv 
     command tar cj $argv 
    else 
     command cat $argv 
    end | nc -l 55555 
end 
+0

은, 그것은 네 – Charlon

2
function send 
    if test -d $argv 
     command tar cjf $argv | nc -l 55555; 
    else if test -e $argv 
     command cat $argv | nc -l 55555; 
    else 
     echo "error: file/directory doesn't exist" 
    end 
end 
2

참고 기능을 단순화 할 수 있습니다 직접 nc -l-tar의 출력, 배열이므로 두 개 이상의 인수를 전달하면 test은 barf가됩니다. 수비를 조금 코딩

$ test -d foo bar 
test: unexpected argument at index 2: 'bar' 

:

function send 
    if test (count $argv) -ne 1 
     echo "Usage: send file_or_dir" 
     return 

    else if test -d $argv[1] 
     # ... 

    else if test -f $argv[1] 
     # ... 

    else 
     # ... 
    end 
end 
+0

작동합니다 :) 감사는 "ARGV는"인수의 벡터를 의미합니다 :) – Charlon