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

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

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

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

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

Q&A

3回答

190閲覧

Linuxでのリダイレクトにて投入コマンド自体も吐き出す方法について

Okamon

総合スコア0

Linux

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

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

0グッド

0クリップ

投稿2025/06/02 18:29

実現したいこと

細かな話ですが、単純にリサーチしても分からず、教えていただけますでしょうか?

Linuxにて通常コマンドを打つと、その結果が標準出力されるも思います。
その結果をリダイレクトしてファイル吐き出しするのですが、投入したコマンドも吐き出して行きたいのです。

例えばカレントディレクトリが /dir/testにいる状態でpwdコマンドの結果をリダイレクトすると、当然テキストファイルには
/dir/testとなるかと思いますが、これを
pwd
/dir/test
のように投入コマンドも履歴として書き込みを行いたいのです。

何かそういったオプションで簡単にできそうな感触を持っていましたが、リサーチしても分からずご存知の方教えていただけないでしょうか?

発生している問題・分からないこと

リダイレクトでテキスト吐き出しをする際、投入コマンドも書き出しする方法がわからない。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

オプション等で投入コマンドも吐き出す。あるいはコマンド実行後、投入したコマンドを必ず一行目に表示させるようなオプションを付与する方法がないか調べたが結論が出ず。

補足

特になし

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

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

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

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

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

melian

2025/06/02 21:00 編集

以下の様な関数を定義して実行するという方法が考えられますが、 function output_with_command_line() { echo "$@" "$@" } bash$ output_with_command_line pwd > pwd.log コマンドラインにクォートやダブルクォートで囲まれた引数があると、それらが外されてしまいます。 bash$ touch 'a b c' bash$ output_with_command_line ls 'a b c' ls a b c 'a b c' その他に、bash 依存になりますがヒストリリストを参照する方法があります。 function output_with_command_line() { local HISTTIMEFORMAT='' echo "$(history 1)" | sed -E "s/^[0-9]+\s+$FUNCNAME\s+//" "$@" } bash$ output_with_command_line ls 'a b c' ls 'a b c' 'a b c' ですが、ヒストリリストからコマンドライン文字列を取得しているためにリダイレクトなどの情報も含まれることになります。 bash$ output_with_command_line pwd > pwd.log bash$ cat pwd.log pwd > pwd.log /dir/test また、シェル変数や環境変数、コマンド置換、Arithmetic Expansion などは展開されずにそのままになります。 bash$ output_with_command_line echo $BASH_VERSION $HOME $(echo Hello World) $((1 + 1)) echo $BASH_VERSION $HOME $(echo Hello World) $((1 + 1)) 5.2.32(1)-release /home/nemo Hello World 2
guest

回答3

0

方法1: set -x を使う

bashでしたら、set -x を有効にすると、実行されたコマンド自体も標準エラー出力に表示されます。
スクリプトのデバッグ用途で利用される機能です。

bash

1$ set -x 2 3# set +x するまでは下記のようにコマンドラインも出力される 4$ pwd 5+ pwd 6/home/user

方法2: ラップ関数を定義する

bash

1with_cmdline() { echo "$*"; "$@"; } 2 3# 上記関数のパラメータとしてコマンドを渡して実行 4$ with_cmdline pwd 5pwd 6/home/user

必要なら alias pwd="with_cmdline pwd" などでエイリアスも登録しておけば、 pwd 自体をechoつきコマンドとして登録する事もできます。

投稿2025/06/02 20:30

Eggpan

総合スコア3271

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

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

0

目的次第ですが、作業ミスがなかったかどうか等を、後で確認するために作業の記録を取りたいということであれば、TakaiYさんの回答のように端末の操作ログをファイルに残すのがいいです。コマンド結果をリダイレクトしてファイルに残すのか、端末に表示すると共にログにも残して、あとでログを見るのか等も選択できます。

必ずログを取りたいのなら、~/.bash_profile等に、scriptコマンドか、(ログを残す設定した)screen tmux等を起動するように書いておけば良いでしょう。
あるいは、「WindowsPCからTeratermでログインしている」とかならTeratermその他の端末ソフト側でログを残す事も出来ます。どっちにログを残すのがいいかは一長一短。

作業記録目的じゃなくて、スポットの場合は、関数を定義するほかに、
sh -vxc "ls /tmp" >& file
とかですかね。ただし、標準エラー出力もリダイレクトされます。(>&が使えないシェルだと>file 2>&1
-v-xは意味が違うので両方書いてます。
ただし、子シェルで-cで実行するので、現在のシェルでの実行と同じ結果でない場合もあります。
関数定義でやる場合でも"$@"で実行するとaliasが効かないとか、現在のシェルでの実行と同じでない部分はあります。aliasを効かせるためにはeval "$@"にすればいいのですが、それはそれで別の問題も起こるので。

投稿2025/06/03 07:35

otn

総合スコア86316

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

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

otn

2025/06/04 15:20 編集

スポットの場合、自分ならどうするかと考えたけど、難しい。 echo ls /tmp >> output.txt !* か。( !*で 先頭語だけ削除して直前行を再実行) !! とか !* とかを知らない人は、Ctrl-Pでヒストリー遡って行編集でecho削除でもいいし。 まあこれも、引数に引用符がある場合はそのまま記録されないとか、コマンド置換があるとそれが2回実行されるとか問題があるので、「引数がややこしい場合は、その都度、うまくいく方法を考える」ですね。 考えるのが面倒くさいときは、scriptコマンドで。
guest

0

いくつか出ていますが追加で

  1. script コマンドを使う
    以降のコマンド入力および出力をすべて記録できます。

  2. screenのログ機能を使う
    端末制御にscreenを使っているのであれば、そのログ機能を使えます。

  3. tmux でログを取る
    tmuxを使っているのであれば、こちらでもログを取ることができます。

方法の詳細とか設定については検索するといろいろ出てきます。

linuxはリモートで使うことが多いと思うので、tmuxなどのターミナル管理ツールを使うと幸せになれると思います。

投稿2025/06/03 01:29

編集2025/06/03 01:30
TakaiY

総合スコア14383

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問