質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Linux

    4441questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • シェル

    282questions

    シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Cシェル内のコマンドを意図的にエラーにする方法

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 3,653
退会済みユーザー

退会済みユーザー

例えば下記のようなコードのシェルを実行したときにrmコマンドを意図的に失敗させて「失敗」を表示させるにはどうすればよいでしょうか?
rmコマンドは例えなので、rmコマンドに限らず他のコマンドでも共通で意図的に失敗させることができるような方法を教えてほしいです。

#!/bin/csh -f

rm /etc/test
if $? != 0 then
   echo "成功"
else
   echo "失敗"
end

exit 0
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

0

失敗させたいコマンドを alias で false にしてはどうでしょう?
イメージ説明

参考情報

追記:
質問文にある csh のスクリプト(すこしだけ変更してる)の実行結果を, 事前に alias することで変化させる例を示します。
イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/08 06:22

    おお!
    aliasコマンド使うと簡単に実現できますね!
    ご回答ありがとうございます。助かります。

    キャンセル

  • 2017/06/08 09:46

    1行目の、
    #!/bin/csh -f

    #!/bin/csh
    に変えないとaliasを定義する.cshrc等を読みませんが、テストのためのスクリプト修正はOKなんでしょうか?
    スクリプト修正OKなら、ずっと簡単です。

    キャンセル

  • 2017/06/08 19:40

    -fオプションは削除できないです・・・。
    それと実際に試してみましたが、やはり-fオプションのせいでaliasが効かないです・・・。

    キャンセル

  • 2017/06/09 06:08

    追記のコマンドを試してみます。

    キャンセル

  • 2017/06/09 20:34

    うまくいきました!ありがとうございます!
    しかし、sourceコマンドについて調べてみましたが、何故`source a.sh`でaliasしたコマンドが読み込まれるのかが分からないです。

    キャンセル

  • 2017/06/09 20:37

    一番最初の`csh`でCシェルに移って?から、Cシェル内で定義したaliasを読み込んでいるということでしょうか?
    (`source a.sh`ではなく単に`a.sh`とコマンド入力すると、Cシェルで定義したaliasではなく、Cシェルに移る前のシェルのaliasが適用されるのかな)

    キャンセル

  • 2017/06/09 20:45

    また、bashのときには
    `alias rm=false`
    だったのに、Cシェルでは
    `alias rm false`
    とコマンドの使い方が違うのは何故なのでしょうか?

    キャンセル

  • 2017/06/09 21:41

    sourceでの実行でテストしても、a.shと新規プロセスとして起動する際のテストにはなりませんよ。

    キャンセル

  • 2017/06/10 15:33

    それはどうしてですか?

    キャンセル

  • 2017/06/11 10:02

    sourceコマンドは「今実行中のcsh」で実行されるからです。

    キャンセル

  • 2017/06/11 13:54

    ごめんなさい。まだよく分からないです。
    何故「今実行中のcsh」で実行するとテストにはならないのですか?

    キャンセル

  • 2017/06/11 17:04

    まあ、テストの精度の問題ですが、環境変数、シェル変数、alias、カレントディレクトリ、親プロセスなどが本番実行と同じ状態(意図的に変えている物を除く)でテストする必要があります。
    #! /bin/csh -f の-fが取れないのと同じ。

    キャンセル

  • 2017/06/11 22:05

    sourceを使ってのテストはcshのオプション-fを除いてしまってテストしていることと同じだということですか?

    キャンセル

  • 2017/06/12 11:36

    同じではないですが、同じレベルより悪いですね。

    キャンセル

0

任意のコマンドを、失敗させる共通的な方法はありません。

rm /etc/testであれば、/etc/testをファイルでなくディレクトリにすれば失敗します。
あるいは、/etcに書き込み権限の無いユーザーで実行するか。

コマンドがビルトインコマンドでも、フルパス指定でも無ければ、こういう方法もありますね。

$ mkdir ~/foo
$ PATH=~/foo:$PATH
$ cp /bin/false ~/foo/rm 
$ hash -r
$ touch bar
$ rm bar # ~/foo/rm つまり /bin/false が実行される
$ echo $?
1
% mkdir ~/foo
% set path=(~/foo $path)
% cp /bin/false ~/foo/false
% rehash
% touch bar
% rm bar
% echo $?
1


ただし、テストしたいrm以外のrmコマンドも全部失敗します。「1つ目のrmは失敗するが、それ以外のrmは成功したい」というのは対象スクリプトを書き換えないと無理かな。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/07 21:55

    1つめの方法は目から鱗が落ちました。
    2つめの方法はちょっと何しているのかが、よく分からないです・・・。
    特にset path=(~/foo $path)とrehash

    キャンセル

  • 2017/06/07 22:04

    変数pathの意味・働きは理解していますか?

    キャンセル

  • 2017/06/07 22:15 編集

    配列のことですか?
    それとも環境変数のことですか?

    キャンセル

  • 2017/06/07 22:39

    csh変数pathのことですが、環境変数PATHと同じ意味です。

    キャンセル

  • 2017/06/08 06:24

    下記2つのコマンドは同じ結果となるのでしょうか?
    PATH=~/foo:$PATH
    set path=(~/foo $path)

    キャンセル

  • 2017/06/08 22:28 編集

    そうですね。cshの場合はset path=のほうが標準です。

    キャンセル

0

適当な(そのコマンドが受け付けない)パラメータ指定するとか。

なにをしたいのかがイマイチ分かりませんが
その辺を書いたら違った回答がでるかも?
--- 追記 ---
自分だったら、コピーしたスクリプトに修正を入れて確認します。
で、その差分をもってテストの担保にする感じ。
ヘタにアレな手段で確認していくと、いざってときに
原因が特定できなくてはまったりしそうな予感が…

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/08 06:23

    シェルの単体テストを実施するので、シェルの中身は書き換えられないのです。

    キャンセル

0

戻り値で判定であればこんな感じでもよいのでは。
「成功」「失敗」が逆の様な???

#!/bin/csh -f

(exit 1)

if $? != 0 then
   echo "成功"
else
   echo "失敗"
endif

exit 0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/08 06:23

    シェルの単体テストを実施するので、シェルの中身は書き換えられないのです。

    キャンセル

0

既に解決済ですが、以下の方法もありますという程度で。

PATHを消す。

PATH=

組み込みコマンド以外は失敗するようになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/08 19:38

    ご回答ありがとうございます。
    試してみます。

    キャンセル

同じタグがついた質問を見る

  • Linux

    4441questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • シェル

    282questions

    シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。