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

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

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

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

Linux

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

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

3回答

857閲覧

Shell Scriptの内部宣言関数の呼び出し

Weapon

総合スコア106

シェルスクリプト

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

Linux

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

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

1グッド

1クリップ

投稿2020/03/12 10:23

前提・実現したいこと

Shell Script(.sh)で内部で宣言した関数をTerminalから呼び出そうとしているのですけどこれはPowerShellと違ってできないのでしょうか
何か権限の問題等があるのでしょうか
それともコード自体に間違いがあるのでしょうか

該当のソースコード

ShellScript

1// a.sh 2#!/bin/bash 3echo "Hello" 4function funcHello() 5{ 6 echo "Hello from function" 7}

Terminal

1User@Machine:~$ ./a.sh 2Hello 3User@Machine:~$ funcHello 4funcHello: コマンドがみつかりません

c.f.

ps1

1//a.ps1 2function funcHello() 3{ 4 echo "Hello" 5}

PowerShell

1PS C:\Users> a.ps1 2PS C:\Users> funcHello 3Hello

補足情報

Ubuntu 18.04
Windows 10 PowerShell

s.k👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

./a.shで起動すると、新たにシェルプロセスが生成されて、その新しいシェル環境の中でコマンドが実行され関数が定義されます。元のコマンドラインのシェルの環境のは影響がありません。

新たにシェルプロセスを生成せずに、コマンドラインのシェルで関数定義をするためには、.(ドットコマンド)またはsourceコマンドでファイルを読み込みます。
. a.shまたはsource a.sh

この場合、a.shには実行権限は不要で、1行目の#!行はコメント以上の意味を持ちません。
なので、sourceコマンドで読み込むファイルは、実行権限を付けないでおくと、間違えて./a.shと実行してしまうことが避けられます(エラーになるので気づく)。.bashrc等も同様です。

投稿2020/03/12 10:59

編集2020/03/12 11:04
otn

総合スコア85901

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

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

0

【 source 】コマンド/【 . 】コマンド――シェルの設定を即座に反映させる:Linux基本コマンドTips(169) - @IT

source を使ってみてください。

追記

ちなみに質問に挙げられている a.ps1 を普通に PowerShell で実行しても funchello を使うことはできません。PowerShell の場合も Bash と同じく . .\a.ps1 のように . を使う必要があります。これをドットソースと呼びますが、こうすることでスクリプト中の変数や関数を現在の環境にエクスポートすることができます。

特定の関数だけエクスポートするには、次のように global スコープを付けます。

PowerShell

1function global:funchello { 2 echo "Hello" 3}

スタートアップに使われる $PROFILE は例外で、グローバルスコープで実行されるので、ここに書かれた関数や変数はデフォルトでエクスポートされます。

PowerShell のスコープについては次が理解しやすいと思います。

PowerShell のスコープ完全に理解した - 鷲ノ巣

投稿2020/03/12 10:30

編集2020/03/12 15:55
Zuishin

総合スコア28669

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

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

0

投稿2020/03/12 11:58

takasima20

総合スコア7464

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問