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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

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

シェル

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

Q&A

解決済

5回答

20235閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Linux

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

シェル

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

0グッド

0クリップ

投稿2017/06/07 12:19

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

#!/bin/csh -f rm /etc/test if $? != 0 then echo "成功" else echo "失敗" end exit 0

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

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

PATHを消す。

PATH=

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

投稿2017/06/08 07:07

moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/08 10:38

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

0

ベストアンサー

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

参考情報

  • false - 何もせずに失敗する

http://kazmax.zpp.jp/cmd/f/false.1.html

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

投稿2017/06/07 21:13

編集2017/06/08 14:41
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/07 21:22

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

2017/06/08 00:46

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

退会済みユーザー

2017/06/08 10:40

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

退会済みユーザー

2017/06/08 21:08

追記のコマンドを試してみます。
退会済みユーザー

退会済みユーザー

2017/06/09 11:34

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

退会済みユーザー

2017/06/09 11:37

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

退会済みユーザー

2017/06/09 11:45

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

2017/06/09 12:41

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

退会済みユーザー

2017/06/10 06:33

それはどうしてですか?
otn

2017/06/11 01:02

sourceコマンドは「今実行中のcsh」で実行されるからです。
退会済みユーザー

退会済みユーザー

2017/06/11 04:54

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

2017/06/11 08:04

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

退会済みユーザー

2017/06/11 13:05

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

2017/06/12 02:36

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

0

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

csh

1#!/bin/csh -f 2 3(exit 1) 4 5if $? != 0 then 6 echo "成功" 7else 8 echo "失敗" 9endif 10 11exit 0 12

投稿2017/06/07 15:21

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/07 21:23

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

0

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

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

投稿2017/06/07 14:01

編集2017/06/08 06:29
takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/07 21:23

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

0

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

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

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

Bash

1$ mkdir ~/foo 2$ PATH=~/foo:$PATH 3$ cp /bin/false ~/foo/rm 4$ hash -r 5$ touch bar 6$ rm bar # ~/foo/rm つまり /bin/false が実行される 7$ echo $? 81
% 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 12:47

otn

総合スコア84533

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/07 12:55

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

2017/06/07 13:04

変数pathの意味・働きは理解していますか?
退会済みユーザー

退会済みユーザー

2017/06/07 13:15 編集

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

2017/06/07 13:39

csh変数pathのことですが、環境変数PATHと同じ意味です。
退会済みユーザー

退会済みユーザー

2017/06/07 21:24

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

2017/06/08 13:29 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問