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

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

新規登録して質問してみよう
ただいま回答率
85.48%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

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

コマンド

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

シェル

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

695閲覧

Pythonから呼び出したシェルスクリプト実行中に、ユーザーがコマンドラインで打った名前のディレクトリを作成したいです!

zenizeni

総合スコア6

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

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

コマンド

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

シェル

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/27 13:17

Pythonから呼び出したシェルスクリプト実行中に、ユーザー側がキーボードで打った「〇〇〇」の名前のディレクトリを作成したいと思っています。
具体的にやりたいことは、Linuxサーバ上で以下の<main.py>と言ういくつかのシェルスクリプトを呼ぶコマンドを実行させる中で、yobidashi2の<mkdir.sh>の実行途中にユーザに好きな名前を入力してもらい、その名前のディレクトリを作成させたいです。また、後の処理では、その「〇〇〇」ディレクトリの下にfileと言うディレクトリを作成したいとも思っています。

python3

1<main.py> 2import subprocess 3 4yobidashi1 = 'chmod 755 /home/main/rm.sh' 5subprocess.call(yobidashi1.split()) 6subprocess.call('/home/main/rm.sh', shell = True) 7 8yobidashi2 = 'chmod 755 /home/main/mkdir.sh' 9subprocess.call(yobidashi2.split()) 10subprocess.call('/home/main/mkdir.sh', shell = True) 11 12yobidashi3 = 以下省略 13   ・ 14   ・ 15   ・

shell

1<mkdir.sh> 2mkdir /home/main/dir 3 4# ここでユーザーに好きな名前「〇〇〇」を打ってもらい、その名前のディレクトリを作成したいです。 5mkdir /home/main/dir/〇〇〇 6 7# 「〇〇〇」ディレクトリ下に新しいディレクトリを作成 8mkdir /home/main/dir/〇〇〇/file

調べたところ、似た質問で、Pythonのargparseやsys.argvを使えばできるとあるのですが、説明を見てもいまいちやり方がわかりません。
わかる方がもしいましたら、教えていただきたいです。宜しくお願いします。

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

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

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

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

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

otn

2020/01/27 13:27

これから書くなら、外部コマンドを呼び出さず、全部Pythonで書けばいいと思うのですが、なぜそうしないのでしょうか?
guest

回答2

0

なんでわざわざShellスクリプトを使うんだろうという疑問はありますが、そこはおくとして。

ポイントは2つあると思います。
ちなみに、argvargparseは出てきません。

  1. Shellで入力を取りこむ方法

「shell キーボード入力」などとして検索すればたくさん例が出てくると思います。基本的には、echoで問い合わせを出して、readで読み込むという手順になるでしょう。

  1. 呼び出したプロセスから値を受け取る

呼び出したshellスクリプトは別プロセスですので、そのプロセスから情報を受け取る方法を使う必要があります。いくつもの方法がありますが、基本的なのを2つ紹介します。

2.1 ファイルで受け渡し

プロセス間での情報の受け渡しにファイルを使います。

  • shellスクリプトで、値をファイルに書き出しておく
echo $dirname > 適切なパス/tmp_output_file.txt
  • python側で、そのファイルを開いて中身を読み込む

2.2 subprocessモジュールでコマンドの出力を受け取る

subprocess.call()は呼び出したプロセスのリターンコードしか取得できませんが、subprocess.check_output()であれば、呼び出したプロセスの出力を受け取れます。また、callcheck_outputは古いので、subprocess.run()を使ったほうがいいでしょう。 使いかたはドキュメントを見ていただくのがいいと思いますが、

  • shellスクリプトで値を標準出力に書き出す。単にechoするだけでしょう。
  • subprocess.run()などで受け取った文字列から値を得る

投稿2020/01/27 13:54

TakaiY

総合スコア12765

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

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

0

ベストアンサー

Bash

1read -p "Input Dirname:" DIR 2mkdir /home/main/dir/"$DIR"

ですが、DIRの内容チェックはしたほうがいいでしょうね。

ということで、このあたりはPythonで書いたほうがいいと思います。

投稿2020/01/27 13:31

otn

総合スコア84555

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

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

otn

2020/01/27 14:03

追記修正依頼にも書きましたが、 これから書くなら、外部コマンドを呼び出さず、全部Pythonで書けばいいと思います。 もしくは、Pythonを使うのをやめて、全部シェルスクリプトで書く。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問