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

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

新規登録して質問してみよう
ただいま回答率
85.48%
コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

シェル

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

Q&A

解決済

2回答

4569閲覧

シェルにてecho -en を使用してファイル書き込みを行った時に -en が文字列として解釈されてしまう。

MiyamotoSatoshi

総合スコア30

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

シェル

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

0グッド

0クリップ

投稿2016/10/13 12:22

下記のようなコマンドを書いた時に想定している動作としては、
CR+LFを末尾につけてファイルに追加書き込みをして欲しいという動作を想定しているのですが、
出力された文字列は下記のようになりました。

なぜ -en が文字列として評価されるのでしょうか?

■書き込まれた文字列

-en 1,2,2016-10-13 19:35:37,2016-10-13 19:35:37

$がついているものは何かしら値や文字列が入っています。

■実行したシェル

ResourceListFileName=出力先ファイル名 echo -en "1,"2","$datetimeString","$datetimeString`\r\n` >> $ResourceListFileName

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

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

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

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

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

ynakano

2016/10/13 12:38

お使いのOSとスクリプトのシェルを教えていただけませんか。
MiyamotoSatoshi

2016/10/13 14:01

すいません、OSはMacOSX 10.11 でシェルは特に指定していないのでMacOSX内臓ものが使用されていると思っています。(あまりこのあたりの種類に詳しくないです。)
ynakano

2016/10/13 14:02

やっぱりそうでしたか。回答が参考になればと思います。
MiyamotoSatoshi

2016/10/13 14:06

ありがとうございます、明日になりますが試してみます。
guest

回答2

0

その echo では -en がオプションとして解釈されなかった
ということでしょうか。
直前に which echo を追加して正体を確認するといいかも。

あと、余談ですが \r\n を囲んだのがバッククオートになってませんか?

投稿2016/10/13 13:16

takasima20

総合スコア7458

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

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

MiyamotoSatoshi

2016/10/14 07:46

ご指摘ありがとうございます、 ダブルクオーテーションにしました。
guest

0

ベストアンサー

Macだとシェルスクリプトで単に"echo"とすると"-n"オプションを認識しないようです。
内部コマンドのechoが呼び出され、"/bin/echo"と微妙に挙動が違うようです。
回避するには"/bin/echo"とフルパスで指定すればよいです。

BSD系とSysV系でechoの挙動が違うという話は昔あったような・・・
今どうだったか記憶が怪しいですが。

MacOSでなかったらごめんなさい。

投稿2016/10/13 12:49

ynakano

総合スコア1894

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

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

MiyamotoSatoshi

2016/10/14 04:56

下記でやってみたのですが、 やはりオプションが文字列として認識されてしまいまして 書き方が間違ってないかなど調査してます。 http://ie.u-ryukyu.ac.jp/e095708/archives/768 に書いてあることを 今調べてます。 シェル内 /bin/echo -en "abcdef\\r\\n" >> "test.txt" シェル名 sh echoTest.sh ファイル内データ -en abcdef\\r\\n
ynakano

2016/10/14 05:09

シェルスクリプトですが、次のようにしたらどうなりますでしょうか。 ・1行目を"#!/bin/bash"にする。 ・"/bin/echo"を単に"echo"にする。 ・実行時は"sh echoTest.sh"ではなく、echoTest.shに実行権限をつけて直接実行する。  (shの引数としてではなく)
MiyamotoSatoshi

2016/10/14 05:21

>実行時は"sh echoTest.sh"ではなく、echoTest.shに実行権限をつけて直接実行する。 ここの部分だけ教えていただいても良いでしょうか? 現在、Jenkinsからシェルを実行しているのですが、 shをつけずにechoTest.shするには echoTest.shファイルに実行権限(x?)を付ければいいでしょうか? chmod 777 echoTest.sh というようなイメージと思ってます。
ynakano

2016/10/14 05:23

はい、それであっています。
MiyamotoSatoshi

2016/10/14 06:38

Jenkins動作すると時間かかるのでMacのシェル上で下記実行しました。 echoTest.sh だとエラーになったので 念のためsh echoTest.sh やってみたのですが■test.txt内の内容になりました。 #!/bin/bash chmod 777 echoTest.sh echoTest.sh -bash: echoTest.sh: command not found ■シェル内 echo -en "abcdef\\r\\n" >> "test.txt" ■test.txt内 -en abcdef ←改行も入っています。
ynakano

2016/10/14 06:57 編集

いただいた実施内容が分かりにくいので、すべきことを整理しますね。 1. 以下のシェルスクリプトを"echoTest.sh"として作成する。 ------------------------------------------------- #!/bin/bash echo -en "abcdef\\r\\n" >> "test.txt" ------------------------------------------------- 2. このシェルスクリプトに実行権限をつける chmod 777 ./echoTest.sh 3. シェルスクリプトを実行する。 ./echoTest.sh ※シェルスクリプト実行時に先頭に"./"をつける必要があります。 「-bash: echoTest.sh: command not found」と出ているのは、シェルが"echoTest.sh"がどこにあるのか分からない(=パスが通っていない)からです。 なので明示的に「カレントディレクトリの直下にシェルスクリプトがある」ことを指定する必要があります。 もし実施した内容が上記と異なっているようでしたら、再度試してみていただけないでしょうか。
MiyamotoSatoshi

2016/10/14 07:41

できました、./echoTest.sh にするだけでした。 出力されたファイルの中身も abcdef となり正しく追加されていました。 後はJenkins側のシェルを修正してやってみます。
ynakano

2016/10/14 07:47

よかったです。 この後も頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問